我最近发现依赖JVM的默认编码会导致错误。在处理 String
,InputStreams
等内容时,我应该明确使用特定的编码,比如 UTF-8。
我有一个庞大的代码库需要扫描以确保这一点。有没有人能够建议一些比搜索整个代码库更简单的方法来检查这一点。
谢谢 Nayn
我最近发现依赖JVM的默认编码会导致错误。在处理 String
,InputStreams
等内容时,我应该明确使用特定的编码,比如 UTF-8。
我有一个庞大的代码库需要扫描以确保这一点。有没有人能够建议一些比搜索整个代码库更简单的方法来检查这一点。
谢谢 Nayn
System.getProperty("file.encoding")
返回用于i/o操作的虚拟机编码方式
您可以通过传递-Dfile.encoding=utf-8
来设置它。
虽然不是直接答案,但为了方便工作,值得知道的是,在一个相当不错的IDE中,你可以搜索使用了InputStreamReader
、OutputStreamWriter
、String#getBytes()
、String(byte[])
、Properties#load()
、URLEncoder#encode()
、URLDecoder#decode()
等方法的地方,并传递字符集进行更新。你还需要搜索FileReader
和FileWriter
,并将它们替换为前两个提到的类。的确,这是一项繁琐的任务,但非常值得,并且我更喜欢这种方法而不是依赖于特定环境。
例如,在Eclipse中,选择感兴趣的项目,按下Ctrl+H,切换到Java Search选项卡,输入InputStreamReader
,勾选Search For选项中的Constructor,选择只有Sources作为Search In选项,然后执行搜索。
FileReader
是坏东西。我不知道这些危险的 API 方法/构造函数的全面列表。 - Tom Hawtin - tacklineFileWriter
和 FileReader
不能被更改以使用指定的编码方式。应该分别替换为 OutputStreamWriter
和 InputStreamReader
。 - BalusC如果文件是在服务器上使用本地工具进行操作,可能需要将编码设置为System.getProperty("file.encoding")。我曾经遇到过两种方式的错误。
最佳实践是了解使用的字符集,并进行设置。此外,如果该文件用于与另一个应用程序进行接口,则应定义所使用的字符集。这可能是Windows代码页或不同的UTF格式。