如何确保Java程序是否使用UTF-8编码

问题描述:

我最近发现依赖JVM的默认编码会导致错误。我应该明确地使用特定的编码。 UTF-8使用String,InputStreams等。 我有一个巨大的代码库来扫描以确保这一点。有人可能会建议我采用一些比搜索整个代码库更简单的方法来检查这一点。如何确保Java程序是否使用UTF-8编码

感谢 Nayn

+0

我阅读帖子:http:// stackoverflow。com/questions/1749064/how-to-find-default-charset-encoding-in-java – Nayn 2010-06-07 16:21:13

+0

你是否指定了utf8以外的编码? 默认情况下,java中的字符串是utf8,所以我在这里没有看到问题。 – 2010-06-07 16:35:05

+2

@Imre:无论何时您将这些字符作为/来自期望/使用不同编码(默认情况下)的外部源的字符进行读取/写入时,都会出现问题。磁盘文件系统,数据存储(数据库),网络连接(HTTP)等。 – BalusC 2010-06-07 16:42:24

不是一个直接的答案设置,但对缓解它的好工作知道在一个体面的IDE你可以只是搜索已使用的发生InputStreamReaderOutputStreamWriterString#getBytes()String(byte[]),Properties#load(),URLEncoder#encode(),URLDecoder#decode()和其中你可以通过字符集,然后相应地更新。您还想搜索FileReaderFileWriter,并将其替换为前面提到的前两类。诚然,这是一项乏味的任务,但值得,而且我更喜欢它依赖于enrivonmental细节。

在Eclipse例如,选择感兴趣的项目(S),命中按Ctrl + ^h,切换到标签的Java搜索,输入例如InputStreamReader,勾选搜索选项构造 ,选择来源作为唯一搜索选项,并执行搜索。

+0

+1很好的提及'InputStreamReader'等等。 – Bozho 2010-06-07 16:37:50

+1

'FileReader'是baddy。我不知道这些危险的API方法/构造函数的完整列表。 – 2010-06-07 17:08:07

System.getProperty("file.encoding") 

返回VM编码为I/O操作

你可以通过-Dfile.encoding=utf-8

+1

请参阅我在评论中提到的主题。以上属性是特定JVM实现的内部实现细节。这个属性在Java 1.5和1.6中的使用有所不同。 – Nayn 2010-06-07 16:28:35

+0

它不是。完整阅读已接受的答案:)这是一个标准设置,用于确定默认字符集。 – Bozho 2010-06-07 16:32:00

+1

设置一个像这样的属性来纠正代码是一种无耻的破解。 – 2010-06-07 17:07:06

依靠JVM 的默认编码导致错误

事实上,每个人都应该指定字符集,当编码/解码。

如果您对所有编码/解码的默认全局字符集(并不总是足够)满意,您可以接受Bozho的答案:在JVM参数或某个静态初始化程序中指定已知的固定缺省值。

但它是很好的做法,搜索所有的隐含字符集规格在你的代码,并用明确的字符集编码替换它们:一些典型的方法/类别查看:FileWriterFileReaderInputStreamReaderOutputStreamWriterString#getBytes()String(byte[])

+2

注意应该是'FileWriter'和'FileReader'不能被改变来采取指定的编码。它们应该分别替换为'OutputStreamWriter'和'InputStreamReader'。 – BalusC 2010-06-07 16:34:19

如果文件被服务器上的本机工具操纵,可能需要将编码设置为System.getProperty(“file.encoding”)。我遇到了两种错误。

最佳做法是知道使用哪个字符集,并设置它。另外,如果文件用于连接到另一个应用程序,则应该定义使用的字符集。这可能是一个Windows代码页或不同的UTF格式。