从导出的jar运行时,将希伯来语写入文件会变成乱码

问题描述 投票:0回答:1

我有一个小程序,用JAVA编写的一些希伯来字母和一些数字写入文件。当我从Eclipse运行程序时,希伯来语写得很好,但如果我将它导出到可执行的JAR文件并从那里运行希伯来语变成乱码

我的代码:

if (content.length() > 0) {
    FileWriter fileWriter = new FileWriter(path);
    BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
    bufferedWriter.write(content);
    bufferedWriter.close();
}

我也尝试使用OutputStreamWriter自己设置编码:

if (content.length() > 0) {
    BufferedWriter bufferedWriter = new BufferedWriter
        (new OutputStreamWriter(new FileOutputStream(path), "windows-1255"));
    bufferedWriter.write(content);
    bufferedWriter.close();
}

我试过的编码:

  • ISO-8859-8
  • 窗户-1255
  • X-IBM856
  • IBM862
  • IBM424
  • UTF-8

当我从eclipse运行程序时,其中一些返回正确的希伯来语,但是当从JAR文件运行时,所有这些都将希伯来语变成了不同类型的乱码。我甚至不确定代码本身的编码是问题还是修复它的方法。

我在Windows 10上使用批处理文件运行JAR。我的java版本信息:

  • java版“10.0.1”2018-04-17
  • Java(TM)SE运行时环境18.3(版本10.0.1 + 10)
  • Java HotSpot(TM)64位服务器VM 18.3(内置10.0.1 + 10,混合模式)

使用UTF-8时的输出示例

来自希伯来文件的一行(由eclipse生成):

210001         188      13 04/09/1804/09/18                                            50.00         1           123456789  לירון קטלן                               הרא"ה 291                                     רמת גן                                                                     6013             

来自乱码文件的同一行(从JAR生成):

210001         188      13 04/09/1804/09/18                                            50.00         1           123456789  לירון קטלן                               הר�"ה 291                                     רמת גן                                                                     6013    

不要介意额外的白色空间,它们应该在那里。

java encoding jar
1个回答
1
投票

具有显式编码的第二个代码段正确跨平台。

检查内容是否正常Unicode:

String content="\u200F\u05D0\u05D1\u05D2\u05D3\u05D4\u200E"; // "אבגדהו"

我使用了u编码,因此java源代码是ASCII,因此java编译器的编码和编辑器的编码应该是错误的,不会导致损坏的字符串。

假设content是一个字符串:

if (!content.isEmpty()) {
    content = "\uFEFF" + content; // Add a BOM char in front for Windows
    Path p = Paths.get(path);
    Files.write(p, Collections.singletonList(content), StandardCharsets.UTF_8);
}

这写了一个UTF-8文件,它将导致最少的问题,除非在以色列境内,人们可能会假设一个国家特定的编码,windows-1255。

我添加了一个BOM字符作为文件的第一个字符,因此Windows可以轻松识别文件,而不是一些ANSI单字节编码,而是UTF-8 Unicode。

然后就有了代表希伯来文的问题。必须有足够的字体。

您可以选择编写HTML文件:

content = "<!DOCTYPE html><html lang="he">"
    + "<head><meta charset=\"utf-8\"></head>"
    + "<body><pre>"
    + content.replace("&", "&amp;")
             .replace("<", "&lt;")
             .replace(">", "&gt")
    + "</pre></body></html>";

我发现这比编写BOM更好。

最后一件事是添加LTR('\ u200E')和RTL(从右到左,'\ u200F')标记字符,但我认为它没有问题。


在某些地方总是使用重载方法,其中编码不存在,默认为当前平台编码。

new InputStreamReader(..., StandardCharsets.UTF_8))

等等。

© www.soinside.com 2019 - 2024. All rights reserved.