【问题标题】:Java Unicode Characters after u 00ffu 00ff 之后的 Java Unicode 字符
【发布时间】:2013-08-04 18:59:10
【问题描述】:

我无法在 00ff 之后打印 unicode 值,而是得到 '?'在 Eclipse 中执行此操作后的字符。这是可以预期的行为吗?

System.out.println("\u01ff");

【问题讨论】:

  • 我认为这与您的文件编码有关,尝试将其写入文件并使用记事本之类的编辑器打开它(如果赢了),或者直接在首选项中检查您的编码

标签: java eclipse unicode


【解决方案1】:

Eclipse 使用默认平台默认编码(在 Windows 中为 cp1252)在保存基于文本的文件和写入标准输出流(System.out 使用)期间解码字符。您需要将其显式设置为 UTF-8 才能实现统治世界。

请注意,这样您也不再需要使用那些 \uXXXX Unicode 转义符来表示基于文本的源文件中的这些字符。

这些问号是因为输出流使用的字符集不支持输入流中指定的字符。

另见:

【讨论】:

  • 当程序在 Eclipse 之外运行时,这将无济于事。
  • "请注意,这样您也不再需要使用那些 \uXXXX Unicode 转义符来表示基于文本的源文件中的这些字符。"除非您希望其他人编译您的程序。
  • @Ted:我没有暗示其他。如果您需要在 Eclipse 之外运行它,只需相应地配置该运行时环境。程序本身不应该负责配置运行时环境。如果您绝对需要按照您的意图呈现角色,只需使用 Swing 框架左右,而不是写入您无法控制的标准输出。
  • @Mike:我们在 2013 年。UTF-8 已经存在十多年了。看到一个现代项目不将 UTF-8 用于源代码文件,我会更加惊讶。
  • OP 的问题是输出不支持 Unicode 字符。您的答案涉及在源代码中使用 Unicode 字符(在 Eclipse 中运行时可能是默认的System.out 编码)。这就是为什么我认为它不能解决 OP 的问题。您对环境的评论是有效的,但您的答案中缺少该信息。此外,并非所有环境都允许您在命令行上指定-Dfile.encoding=UTF-8 或将JAVA_TOOL_OPTIONS 环境变量设置为包含-Dfile.encoding=UTF8。从代码中施加显式控制要好得多。
【解决方案2】:

问题在于System.out 使用的编码;默认情况下,它是您平台的本机编码(通常不是 UTF-8)。您可以通过替换流来显式更改编码:

try {
    PrintStream ps = new PrintStream(System.out, true, "UTF-8");
    System.setOut(ps);
} catch (UnsupportedEncodingException error) {
    System.err.println(error);
}

在此之后(除非底层环境出现字体或编码问题),所有 Unicode 字符都应在 System.out 上正确打印。

编辑根据我和 BalusC 在his answer 上的反复讨论,这还不足以(甚至是必要的)让事情在 Eclipse 中运行。您有两个问题需要解决:在写入System.out 时使用正确的编码,然后在Eclipse 控制台视图中显示控制台输出时使用正确的编码。 BalusC 的回答解决了这两个问题。不幸的是,它不能解决在 Eclipse 之外运行的问题。为此,您需要使用我上面的方法或设置默认的运行时编码。这可以通过在命令行上使用标志-Dfile.encoding=UTF-8 或设置环境变量JAVA_TOOL_OPTIONS 以包含-Dfile.encoding=UTF-8 来完成。要在 Eclipse 之外成功运行代码,这可能是最好的方法。

【讨论】:

  • 这根本不起作用。这只是告诉流使用哪种编码来编码提供给它的字符。它不会告诉标准输出控制台(“另一端”)使用哪种编码从流中解码它们。到目前为止,为什么这个答案得到了 3 个赞成票,这完全超出了我的理解。 SO上有这么多傻瓜吗?相关问答:stackoverflow.com/questions/12061418/character-encoding-in-java
  • @BalusC - 这相当苛刻。您的答案在 Eclipse 之外根本不起作用,但我不认为您到目前为止获得的 4 个赞成票来自傻瓜。
  • 这需要在每个运行时环境的基础上进行配置。没有涵盖所有运行时环境的单一答案。 OP 用的是 Eclipse,所以我专门回答了。
【解决方案3】:

Java 可以很好地处理这些字符。但是输出团队会有特定的编码。

除非该编码是 UTF-8 或 UTF-16 之类的,否则它无法以 Unicode 编码每个字符。而当它遇到一个它不能表示的字符时,它会被一个问号代替。

【讨论】:

    【解决方案4】:

    JVM 也使用System.out 的默认文件编码。

    例如,在 Linux 上,如果您的 $LANG 变量设置为 de_DE.UTF-8,则 file.encoding 的值将相应导出,并设置为 utf-8

    如果JVM不能派生出你想要的设置,你可以通过设置系统属性来改变文件编码:

    java -Dfile.encoding=utf-8 ...

    在命令行上。

    您也可以在 Eclipse 中使用 运行配置 执行此操作(上下文菜单 - 运行方式 - 运行配置 ... - 参数 - VM 参数)

    所以这对命令行和Eclipse都有效,并且不需要在源代码中明确定义编码。


    如果值设置为

    java -Dfile.encoding=iso-8859-1

    例如,只能表示 Unicode 字符的子集,因为该字符集仅支持有限数量的字符。其他的将显示为?


    还有两点需要牢记:

    • 接收流的设备(终端、外壳等)必须正确解码。以 GNOME 的终端为例,您可以在菜单中设置字符编码。

    • 该终端等使用的字体必须包含该字符的图形表示

    【讨论】:

      猜你喜欢
      • 2016-11-04
      • 2016-07-06
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 2021-12-12
      • 2011-02-05
      相关资源
      最近更新 更多