【问题标题】:Encoding string doesn't work properly in java编码字符串在java中不能正常工作
【发布时间】:2020-01-08 11:41:59
【问题描述】:

我正在开发一个 JavaFX 应用程序。我需要使用波斯语作为节点名称以编程方式创建TreeView
问题是我在运行应用程序时看到奇怪的字符。我已经在网上搜索过同样的问题。我编写了一个函数来根据同一问题的答案进行编码:

public static String getUTF(String encodeString) {
        return new String(encodeString.getBytes(StandardCharsets.ISO_8859_1),
                         StandardCharsets.UTF_8);
}

我用它来转换我的字符串来构建TreeView

CheckBoxTreeItem<String> userManagement = 
             new CheckBoxTreeItem<>(GlobalItems.getUTF("کاربران"));

此答案不适用于某些字符:

我仍然得到奇怪的结果。如果我不使用编码,我会得到:

【问题讨论】:

  • 这个解决方案太可怕了,完全删除它。 “我看到奇怪的字符” -> 更具体,让我们找出编码问题在哪里,然后消除编码问题而不是尝试清理它。
  • 您的getUTF 方法是不必要的,并且可能是有害的。 String 已经是一个解码的字符序列。在实际将字符序列转换为字节时,您只需要担心编码,反之亦然;例如,在读取或写入外部位置(例如文件、网络等)时。请注意,如果您的 Java 源代码中有字符串文字,请确保源文件和 javac 都使用适当的编码(请参阅 Joop 的答案)。
  • @Slaw 我应该如何检查源文件和javac 是否使用适当的编码。我正在使用 IntelliJ。
  • 注意:Java(和 JavaScript、.NET、VB4/5/6 等)中的文本数据类型(Stringchar)是 UTF-16 代码单元的计数序列。 UTF-16 是 Unicode 字符集的字符编码。因此,您自然而然地找到的代码毫无意义。 (通过适当的 cmets 和命名,它可以用来解开非常扭曲的编码方案。)

标签: java string javafx encoding character-encoding


【解决方案1】:

对于硬编码的字符串文字,您需要告诉 javac 编译器使用与 java 源代码相同的编码,例如 UTF-8。检查 IDE/构建设置。您可以转义一些波斯语符号, \u062f 代表 Dal,د。如果转义字符正确通过,则编译器使用了错误的编码。

String 将始终包含 Unicode,没有 new Strings 需要黑客重新转换。

读取带有文本的文件,需要将这些字节(byte/InputStream)转换为 java 文本(String/Reader),指定这些字节的编码

【讨论】:

  • 感谢您的回复。你能告诉我应该在哪里检查我的 javac 编码吗?我正在使用 IntelliJ IDE。
  • 首先检查这确实是问题所在。通过尝试转义文本。例如使用小应用程序字符映射。全局/项目设置,构建/编译应该有一个选项。理想情况下,编辑器只编码一个选项。 Maven(一种构建工具)在 pom.xml 中定义了编码。
  • 在 IntelliJ 的右下角看到类似 CRLF UTF-8 的内容:Windows CR+LF =\r\n 中的行结尾和 UTF-8 编码。文件/设置/编辑器/文件编码和文件/构建(,执行,部署)。
  • 如果我使用 U 转义 \u062F,它会为我正确输出 د
  • 我正在使用gradle。所以我在我的依赖项中设置:compileJava.options.encoding = 'UTF-8'
猜你喜欢
  • 1970-01-01
  • 2016-07-14
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多