0

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

该应用程序在 Windows 中运行良好,但在我们的 Solaris 机器上它无法识别特殊字符并引发异常。例如,当它在“Gérer”中遇到重音 e 时,它​​会说:-

      遇到:“\u0161”(353),之后:“\'G\u00c3\u00a9rer les mod\u00c3”

(从我们的应用程序抛出的异常)

我怀疑为了阻止这种情况发生,我需要更改 JVM 的 file.encoding 属性。我试图通过 System.setProperty() 来做到这一点,但它并没有阻止错误的发生。

对我能做什么有什么建议吗?我正在考虑将 /etc/default/init 中的 solaris 平台的基本语言环境设置为 UTF-8。有人认为这可能会有所帮助吗?

任何想法都非常感谢。

4

8 回答 8

4

native2ascii这看起来像是使用错误参数转换的文件。为了演示,创建一个包含内容的文件

Gérer les modÚ

并将其保存为“a.txt”,编码为 UTF-8。然后运行这个命令:

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。

于 2008-10-30T18:45:45.683 回答
2

尝试使用

java -Dfile.encoding=UTF-8 ...

在两个系统中启动应用程序时。

解决问题的另一种方法是将编码从两个系统更改为 UTF-8,但我更喜欢第一个选项(对系统的干扰较小)。

编辑:

在stackoverflow上检查这个答案,它可能会有所帮助:

更改 String(byte[]) 的默认编码

于 2008-10-30T17:03:30.053 回答
1

在读取和写入特定文本数据时指定字符编码,而不是设置系统范围的字符编码,可能更容易、更健壮。您的应用程序如何读取文件?所有 Java I/O 包读取器和写入器都支持传入一个字符编码名称,以便在从字节读取/写入文本时使用。如果您没有指定一个,它将使用平台默认编码,就像您可能遇到的那样。

一些数据库在它们可以接受的文本编码方面令人惊讶地受到限制。如果您的 Java 应用程序以适当的编码将文件作为文本读取,那么它可以根据需要将其输出到数据库。如果您的数据库不支持其字符集包含您拥有的非 ASCII 字符的任何编码,那么您可能需要先将非英文文本编码为 UTF-8 字节,然后 Base64 将这些字节编码为 ASCII 文本.

PS:String.getBytes()由于您所看到的原因,切勿使用没有字符编码参数。

于 2008-10-30T23:34:04.197 回答
1

我设法通过运行命令克服了这个错误

导出 LC_ALL='en_GB.UTF-8'

此命令设置我所在的 shell 的语言环境。这将所有 LC_ 环境变量设置为 Unicode 文件编码。

非常感谢您的所有建议。

于 2008-10-31T11:58:23.503 回答
0

此外,您可能需要验证是否安装了支持 UTF-8(SUNWeulux、SUNWeuluf 等)的操作系统包。

于 2008-10-31T01:22:35.023 回答
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")));
于 2010-05-24T06:16:13.183 回答
0

你也可以在命令行设置编码,像这样java -Dfile.encoding=utf-8

于 2008-10-30T17:03:45.747 回答
0

我认为我们需要更多信息才能帮助您解决问题:

  1. 你到底得到了什么异常,当它发生时你调用了哪个方法。
  2. 输入文件的编码是什么?UTF8?UTF16/Unicode?ISO8859-1?

如果您能向我们提供相关的代码片段,也会很有帮助。

另外,我想指出几点:

  1. 问题不在“é”处发生,而是在稍后发生。
  2. 听起来字符编码可能在您的应用程序中的某个地方进行了硬编码。
于 2008-10-31T00:52:23.227 回答