当前位置: 首页 > 知识库问答 >
问题:

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

壤驷德宇
2023-03-14

我有一个用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文件运行时,所有这些都将希伯来语转换为不同类型的胡言乱语。我甚至不确定代码本身的编码是否是问题所在,也不确定解决问题的方法。

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

  • java版本“10.0.1”2018-04-17

使用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    

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

共有1个答案

颜乐
2023-03-14

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

检查内容是否正确:

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))

诸如此类。

 类似资料:
  • 问题内容: 我有一个小的Java方法,可将短消息插入到MySQL数据库中。该表的默认排序规则是utf8_unicode_ci,而Java代码是: 问题是,当lMessage是希伯来语时,结果是字符串“ ??????” 顺便说一句:我不知道它是否有帮助,但是还有一个PHP脚本有时会写入此数据库中的另一个相似表,并且可以正常工作。 问题答案: 在代码中设置UTF-8。看到这个;

  • Adobe 亚洲语言书写器 借助 Adobe 亚洲语言书写器,您可以使用中东和南亚语言创建内容。您可以键入或混合键入阿拉伯语、希伯来语、英语和其他语言。 您可以在“段落”面板菜单(窗口 > 段落 > 面板菜单)中的可用书写器之间进行选择。例如,您可以使用中东和南亚语言单行书写器或中东和南亚语言逐行书写器。 有关 Illustrator 中支持的其他亚洲语言的更多信息,请参阅适用于亚洲语言文字的书写

  • 启用中东语言功能 若要在 Photoshop 界面中显示中东文字选项,请执行以下操作: 选取“编辑”>“首选项”>“文字”(Windows) 或“Photoshop”>“首选项”>“文字”(Mac OS)。 在“选取文本引擎选项”部分中,选取“中东”。 单击“确定”,并重新启动 Photoshop。 选取“文字”>“语言选项”>“中东语言功能”。 文本方向 要创建阿拉伯语和希伯来语内容,您可以将默

  • 我正在Docker容器中运行一个罐子。我的应用程序的功能是连接到一个数据库,获取记录并将其输出到一个名为Reports的文件夹中的.csv文件中。 绑定应用程序是否保留了项目结构?(因为我需要在docker容器中手动创建一个名为reports的文件夹)我需要以任何方式为创建的文件夹(reports)提供权限吗?(我在这里就是这么做的)

  • 我尝试将一个具有不同库的Java项目导出到一个可运行的JAR文件中,其中包括一个JavaFX GUI和许多不同的东西。当我在eclipse中运行我的项目时,没有问题。但是,当我试图将它导出到一个可运行的JAR文件,然后我尝试启动时,它从来没有打开一个窗口,只有一个进程在后台运行。 我不知道如何更好地描述我的问题。但也许你已经可以帮我了解这些信息了。 (使用eclipse)

  • 我有一个java项目。我想把它导出到可运行的jar文件。 我用eclipse来做这件事。 但当我运行创建的jar文件时,我会收到(系统找不到指定的路径)。 如何在任何地方导出文件夹以运行success jar文件?