Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java应用程序在特殊字符上失败_Java_Character Encoding_Solaris_Locale_Special Characters - Fatal编程技术网

Java应用程序在特殊字符上失败

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属性。我试

我正在使用的应用程序从文件中读取信息以填充数据库。文件中的某些字符是非英语字符,例如重音法语字符

该应用程序在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 -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