我正在处理的应用程序从文件中读取信息以填充数据库。文件中的某些字符是非英语字符,例如带重音的法语字符。
该应用程序在Windows中正常运行,但在我们的Solaris机器上,它无法识别特殊字符并抛出异常。例如,当它遇到“Gérer”中的重音e时,它会说: -
Encountered: "\u0161" (353), after : "\'G\u00c3\u00a9rer les mod\u00c3"
(从我们的应用程序抛出的异常)
我怀疑为了阻止这种情况发生,我需要更改JVM的file.encoding属性。我尝试通过System.setProperty()执行此操作,但它没有停止发生错误。
对于我能做什么有什么建议吗?我在考虑将/ etc / default / init中solaris平台的基本语言环境设置为UTF-8。有人认为这可能会有所帮助吗?
非常感谢任何想法。
答案 0 :(得分:4)
这看起来像是由native2ascii
使用错误参数转换的文件。要演示,请创建包含内容的文件
Gérer les modÚ
并将其保存为编码为UTF-8的“a.txt”。然后运行以下命令:
native2ascii -encoding windows-1252 a.txt b.txt
打开新文件,您应该看到:
G\u00c3\u00a9rer les mod\u00c3\u0161
现在反转过程,但这次指定ISO-8859-1:
native2ascii -reverse -encoding ISO-8859-1 b.txt c.txt
将新文件读取为UTF-8,您应该看到:
Gérer les modÀ\u0161
它可以恢复“é”,但是就像你的应用程序那样窒息“Ú”。
我不知道你的应用程序出了什么问题,但我很确定不正确使用native2ascii是其中的一部分。这可能是让应用程序使用系统默认编码的结果。您应该始终在保存文本时指定编码,无论是文件还是数据库,或者是什么 - 永远不要让它默认。如果您没有充分理由选择其他内容,请使用UTF-8。
答案 1 :(得分:2)
尝试使用
java -Dfile.encoding=UTF-8 ...
在两个系统中启动应用程序时。
另一种解决问题的方法是将编码从两个系统更改为UTF-8,但我更喜欢第一个选项(对系统的干扰较小)。
编辑:
在stackoverflow上检查这个答案,它可能会有所帮助:
答案 2 :(得分:1)
在读取和写入特定文本数据时,指定字符编码可能更容易,也更健壮,而不是设置系统范围的字符编码。您的应用程序如何读取文件?所有Java I / O包读取器和写入器都支持传入字符编码名称,以便在向/从字节读取/写入文本时使用。如果您没有指定,那么它将使用平台默认编码,正如您可能遇到的那样。
有些数据库在他们可以接受的文本编码方面受到惊人的限制。如果您的Java应用程序以正确的编码将文件作为文本读取,那么它可以将其输出到数据库,但它需要它。如果您的数据库不支持其字符repetoire包含您拥有的非ASCII字符的任何编码,那么您可能需要先编码非英文文本,例如编码为UTF-8字节,然后Base64将这些字节编码为ASCII文本
PS:绝对不要使用没有字符编码参数的String.getBytes()
,原因正是您所看到的。
答案 3 :(得分:1)
我设法通过运行命令
来解决此错误export LC_ALL='en_GB.UTF-8'
此命令设置我所在的shell的语言环境。这会将所有LC_环境变量设置为Unicode文件编码。
非常感谢您的所有建议。
答案 4 :(得分:0)
您也可以在命令行设置编码,如java -Dfile.encoding=utf-8
。
答案 5 :(得分:0)
我认为我们需要更多信息才能帮助您解决问题:
如果您能向我们提供相关的代码段,也会很有帮助。
另外,我想指出的一些事情:
答案 6 :(得分:0)
此外,您可能需要验证是否已安装支持UTF-8(SUNWeulux,SUNWeuluf等)的操作系统软件包。
答案 7 :(得分:0)
Java在读取和写入文件时使用操作系统的默认编码。现在,人们永远不应该依赖于此。明确指定编码始终是一个好习惯。
在Java中,您可以使用以下内容进行阅读和写作:
读:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(inputPath),"UTF-8"));
写作:
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8")));