Java应用程序在特殊字符上失败
我正在使用的应用程序从文件中读取信息以填充数据库。文件中的某些字符是非英语字符,例如重音法语字符 该应用程序在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。有人认为这会有帮助吗 任何想法都是非常感谢的。尝试使用Java应用程序在特殊字符上失败,java,character-encoding,solaris,locale,special-characters,Java,Character Encoding,Solaris,Locale,Special Characters,我正在使用的应用程序从文件中读取信息以填充数据库。文件中的某些字符是非英语字符,例如重音法语字符 该应用程序在Windows中运行良好,但在我们的Solaris机器上,它无法识别特殊字符,并引发异常。例如,当它遇到Gérer中的重音e时,它会说:- Encountered: "\u0161" (353), after : "\'G\u00c3\u00a9rer les mod\u00c3" 从应用程序中抛出的异常 我怀疑为了阻止这种情况发生,我需要更改JVM的file.encoding属性。我试
java -Dfile.encoding=UTF-8 ...
在两个系统中启动应用程序时
解决这个问题的另一种方法是将编码从两个系统都更改为UTF-8,但我更喜欢第一个选项,它对系统的干扰较小
编辑:
在stackoverflow上检查此答案,它可能有助于:
您还可以在命令行中设置编码,例如java-Dfile.encoding=utf-8。这看起来像是native2ascii使用错误参数转换的文件。要演示,请创建一个包含内容的文件
Gérer les modÚ
并使用UTF-8编码将其另存为.txt。然后运行以下命令:
native2ascii -encoding windows-1252 a.txt b.txt
打开新文件,您将看到以下内容:
G\u00c3\u00a9rer les mod\u00c3\u0161
Gérer les modÀ\u0161
现在,请反向执行此过程,但这次请指定ISO-8859-1:
native2ascii -reverse -encoding ISO-8859-1 b.txt c.txt
将新文件读取为UTF-8,您应该会看到:
G\u00c3\u00a9rer les mod\u00c3\u0161
Gérer les modÀ\u0161
它可以恢复Ú,但会被Ú卡住,就像你的应用程序一样
我不知道你的应用程序出了什么问题,但我很确定native2ascii的不正确使用是其中的一部分。这可能是让应用程序使用系统默认编码的结果。在保存文本时,您应该始终指定编码,无论是保存到文件还是数据库,或者是从不允许默认的编码。如果您没有很好的理由选择其他内容,请使用UTF-8。在读取和写入特定文本数据时,指定字符编码可能更容易、更可靠,而不是设置系统范围的字符编码。应用程序如何读取文件?所有Java I/O包读取器和写入器都支持传入一个字符编码名称,以便在字节之间读取/写入文本时使用。如果您没有指定一个,它将使用平台默认编码,就像您可能遇到的那样 有些数据库在可以接受的文本编码方面受到了惊人的限制。如果Java应用程序以正确的编码将文件读取为文本,那么它可以根据需要将其输出到数据库。如果您的数据库不支持字符重复包含非ASCII字符的任何编码,则可能需要首先将非英语文本编码为UTF-8字节,然后将这些字节编码为ASCII文本
PS:绝对不要使用没有字符编码参数的String.getBytes,原因正是您看到的。我想我们需要更多信息来帮助您解决问题: 您究竟得到了什么样的异常,以及在异常发生时调用了哪个方法。 输入文件的编码是什么?UTF8?UTF16/Unicode?ISO8859-1? 如果您能为我们提供相关的代码片段,也会很有帮助 另外,我想指出几点: 这个问题不是在“é”发生的,而是以后发生的。 听起来,字符编码可能在应用程序的某个地方被硬编码。
此外,您可能希望验证是否安装了支持UTF-8 SUNWeulux、SUNWeuluf等的操作系统包。我通过运行命令成功地克服了此错误 export LC_ALL='en_GB.UTF-8' 此命令设置我所在的shell的区域设置。这将所有LC_uu环境变量设置为Unicode文件编码
非常感谢你的建议 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")));
是的,我以前见过。我唯一的问题是找不到java命令实际运行的位置。这是因为程序正在使用Ant来运行代码。谢谢你的回答,不过我会尝试使用它。异常是在我们的软件中定义的,它是在解析器尝试了所有操作但仍然无法识别字符时抛出的。它使用的编码是系统默认编码,默认设置为en_GB.ISO8859-15。我正在寻找一种方法来强制应用程序读取UTF8