gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:01:31 25 4
gpt4 key购买 nike

我有一个用 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
  • windows-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    

不要介意多余的空格,它们应该在那里。

最佳答案

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

检查内容是否正确 Unicode:

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

我使用了u-encoding,所以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))

等等。

关于java - 从导出的 jar 运行时,将希伯来语写入文件会变成乱码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52200375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com