【问题标题】:Java - é becomes é - How to fix it [duplicate]Java - é 变成 é - 如何修复它 [重复]
【发布时间】:2013-04-18 23:30:45
【问题描述】:

我有一个法语文件夹树。当我阅读它的文件夹/文件时,它返回 é 而不是 é。我替换了字符,但这不是一个好的解决方案。我怎样才能解决这个问题 ? 我在谷歌上找到了一些答案,但对我没有帮助。

谢谢!

【问题讨论】:

  • 您可以从发布您正在使用的代码开始。您可能只是在使用默认字符编码进行阅读,而它可能应该是 UTF-8,但如果没有看到您的代码,我们就无法判断。
  • 还要注意您系统中设置的操作系统和默认区域设置。例如,在设置了俄语区域设置/语言的 Windows 中,所有文件名都以Cp866 编码进行编码。我认为对于其他语言,Windows 中使用了另一种非 unicode 编码。
  • 我通过提供根文件夹路径来访问子文件夹。根路径名是英文的。我只是使用 `new File(rootPath)' 没什么特别的。如果文件夹/文件包含 é ,java 无法找到它。
  • 这看起来像是使用旧编码(例如 windows-1252 或 ISO-8859-15)解码的 UTF-8 字节序列。确保 JRE 的默认编码与系统默认编码匹配。
  • System.getProperty("file.encoding")Charset.defaultCharset() 返回什么?

标签: java unicode character-encoding


【解决方案1】:

启动应用程序时,set the encoding to utf-8:

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

请注意,正如上面链接中提到的,许多 Java 类会缓存编码;因此,如果您在运行时更改编码,它可能不会影响我们关注的所有类。

tchrist中的his answer解释复制到another question

\N{LATIN SMALL LETTER E WITH ACUTE} 字符是代码点 U+00E9。 在 UTF-8 中,即\xC3\xA9

但是,如果您转身将这两个字节视为不同的代码 点U+00C3U+00A9,分别是\N{LATIN CAPITAL LETTER A WITH TILDE}\N{COPYRIGHT SIGN}

【讨论】:

  • 在代码中的某处显式设置编码可能更有意义,而不是在 VM 中全局设置。请注意,file.encoding 属性甚至不控制 Java SE 标准库中的所有默认编码。
【解决方案2】:

您遇到了编码问题。

任何字符串实际上都是一组位。为了使它们可读,我们使用位组到我们可以阅读的字符表示的映射。这些“地图”代表所谓的编码。

您遇到的问题是因为您读取使用一个“地图”编码的位并使用另一个“地图”显示它。

请务必使用相同的编码,并始终检查您的字符串操作函数是否适用于所使用的编码。它是您的应用程序正常工作的基础。

【讨论】:

    【解决方案3】:

    这通常发生在您没有以正确的编码格式(可能是 UTF-8)解码文本时发生。

    如果您想要更准确的答案,请将您的代码发布给我们,以便我们尝试更正它。

    【讨论】:

      【解决方案4】:

      代码正在显示正确的位 — 错误在于您用来查看这些位的东西已被告知这些位的编码与实际不同。

      这不是 Java 问题。这是您用于查看 Java 输出的任何软件的问题。例如,您的终端编码可能设置为 ISO-8859-15,而不是 Java 发出的 UTF-8。

      为外部世界提供一个全 UTF-8 的工作流程和一个由抽象 Unicode 代码点组成的内部世界确实很有帮助。

      我想您可能误读了某些输入,即 UTF-8 格式的输入,但您误读为某些传统的 8 位编码。但我最好的猜测是已经给出的那个,你的显示设备/程序的编码设置错误。

      【讨论】:

        【解决方案5】:

        我使用下面的代码将é java unicode 打印到文件正在工作

        writer1 = new FileWriter(outputFile, true);
        writer2 = new BufferedWriter(writer1);
        String str = new String(stringBuffer.toString().getBytes(), **"ISO-8859-1"**);
        writer2.write(str);
        writer1.flush();
        writer2.flush();
        

        【讨论】:

          猜你喜欢
          • 2011-08-07
          • 1970-01-01
          • 1970-01-01
          • 2011-05-18
          • 2016-06-23
          • 1970-01-01
          • 1970-01-01
          • 2015-05-28
          • 2018-08-29
          相关资源
          最近更新 更多