我正在OS X上使用Java平台处理Unicode文本文件。当我使用TextEdit或TextWrangler打开文件而不是看到“Nattvardsgästerna”时,我看到“Nattvardsg‰sterna”(这是不正确的)。当我使用Java io流打开文件时,我看到同样不正确的String
“Nattvardsg‰sterna”。
当我在电脑上打开文件时,我看到了正确的字符串。我不知道从哪里开始解决这个问题...这是我的OS X设置的问题吗?我应该用特殊标志打开Java流吗?
感谢。
P.S。我打开文件是这样的:fileReader = new BufferedReader(new FileReader(file));
P.S.S。另外,我应该提一下,我想将结果输出为SQL文本文件,因此操作系统必须正确区分ä。
答案 0 :(得分:3)
InputStream
读取字节(不是字符),所以我假设你说:
当我使用java io stream
打开文件时
...当我使用Java Reader
“打开文件时,你的意思是。
编辑:您的评论说你正在这样做:
new BufferedReader(new FileReader(file));
InputStreamReader
有constructor,可让您设置字符编码。如果您未指定,则将使用平台默认值。平台默认不太可能是unicode(在我的Macbook上,它设置为“US-ASCII”)。
为了设置字符编码,您必须创建中间输入流阅读器,而不是让FileReader
为您执行此操作(因为FileReader
使用平台默认编码)。
假设文件使用UTF-8进行编码,请使用:
new BufferedReader(new InputStreamReader(new FileInputStream(file),
Charset.forName("UTF-8")));
或者,您可以通过向JVM提供参数来更改平台默认值。您可以查看this answer以获取完整的详细信息,但基本思想是设置file.encoding
Java系统属性。链接的答案提供了一些实现此目的的方法。
进一步编辑:
P.S.S。另外,我应该提一下,我想将结果输出为SQL文本文件,因此操作系统正确区分ä非常重要。
操作系统与此无关。文件系统只是改组字节。如何解释这些字节完全取决于正在读取这些文件的应用程序。这个答案告诉你如何让你的Java程序正确解释字节。为了使您的数据库能够正确解释字节,您需要配置数据库编码。