如何确保java程序使用UTF-8编码

如何确保java程序使用UTF-8编码,java,utf-8,Java,Utf 8,我最近发现依赖JVM的默认编码会导致bug。在处理字符串、InputStreams等时,我应该明确使用特定的编码,例如UTF-8。 我有一个庞大的代码库来扫描以确保这一点。有没有人能给我推荐一种比搜索整个代码库更简单的方法来检查这个问题 谢谢 纳恩 返回i/o操作的VM编码 您可以通过传递-Dfile.encoding=utf-8来设置它,这不是一个直接的答案,但为了简化工作,最好知道在一个稍微体面的IDE中,您可以只搜索使用过的InputStreamReader、OutputStreamWri

我最近发现依赖JVM的默认编码会导致bug。在处理字符串、InputStreams等时,我应该明确使用特定的编码,例如UTF-8。 我有一个庞大的代码库来扫描以确保这一点。有没有人能给我推荐一种比搜索整个代码库更简单的方法来检查这个问题

谢谢 纳恩

返回i/o操作的VM编码


您可以通过传递-Dfile.encoding=utf-8来设置它,这不是一个直接的答案,但为了简化工作,最好知道在一个稍微体面的IDE中,您可以只搜索使用过的InputStreamReader、OutputStreamWriter、StringgetBytes、Stringbyte[],Properties Load、UrlEncoderCode,URLDecordeCode和consort,您可以在其中传递字符集,然后相应地进行更新。您还希望搜索FileReader和FileWriter,并用前面提到的两个类替换它们。诚然,这是一项乏味的任务,但值得一试,我更喜欢它,而不是依赖于丰富的细节

例如,在Eclipse中,选择感兴趣的项目,点击Ctrl+H,切换到tab Java Search,输入例如InputStreamReader,勾选Search for选项构造函数,选择Sources作为唯一的Search In选项,然后执行搜索

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

事实上,编码/解码时应该始终指定字符集

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


但最好在代码中搜索所有隐式字符集规范,并用显式字符集编码替换它们:要查看的一些典型方法/类:FileWriter、FileReader、InputStreamReader、OutputStreamWriter、StringgetBytes、Stringbyte[].

如果文件由服务器上的本机工具操作,则可能需要将编码设置为System.getPropertyfile.encoding。我在这两方面都遇到了错误


最佳实践是知道使用哪个字符集,并设置它。此外,如果文件用于与其他应用程序接口,则应定义所使用的字符集。这可能是windows代码页或不同的UTF格式。

我读了这篇文章:您是否在指定utf8以外的编码?默认情况下,java中的字符串是utf8,因此我看这里没有问题。@Imre:当您从外部源(默认情况下需要/使用不同的编码,例如磁盘文件系统、数据存储数据库、网络连接HTTP等)以字符的形式读/写这些字符时,问题就会显现出来。@Imre no,在Java中,默认情况下字符串不是UTF-8。字符串由16位Unicode字符组成。如果从文件读取文本或向文件写入文本,则这些16位Unicode字符将使用依赖于平台的默认字符编码进行编码。默认编码并不总是UTF-8。请参阅我在评论中提到的线程。上述属性是特定JVM实现的内部实现细节。在Java 1.5和1.6中,此属性的使用有所不同。请仔细阅读接受的答案:这是一个确定默认字符集的标准设置。设置这样的属性来更正代码是一个不可容忍的错误。@Tom我不同意你的观点。虽然最好不要依赖于此,而且我从来没有这样做过,但使用VM参数是合法的。我必须承认,如果不将系统属性设置为-Dfile.encoding=utf-8,我就无法解决此问题。我尝试了所有可能的方法,尽可能地使用编码。应该注意的是,不能将FileWriter和FileReader更改为使用指定的编码。它们应该分别替换为OutputStreamWriter和InputStreamReader。FileReader是个坏蛋。我不知道这些危险的API方法/构造函数的完整列表。
System.getProperty("file.encoding")