【问题标题】:Extended Ascii doesn't work in console!扩展的 Ascii 在控制台中不起作用!
【发布时间】:2011-02-24 04:07:31
【问题描述】:

例如 System.out.println("╚"); 显示为?,System.out.println("\u255a");

为什么这不起作用? Stdout 确实支持这些字符,所以我不明白。

【问题讨论】:

  • 1) “扩展的 Ascii”完全没有意义。 2)这显然不是你的代码。 3) 什么操作系统/终端?
  • Windows 中的命令提示符。而Extended ascii就是所谓的。
  • @jleedev 告诉 OP 你的真实感受...
  • @DasWood by "Extended ASCII" 你指的是非打印字符吗?因为,如果是这样的话,那么是的,它们将不会显示。据我所知,大多数控制台只会在 0-127 范围内显示,但我从未真正研究过它,所以我可能是错的。
  • From Wikipedia:“该术语的使用有时会受到批评,因为它可能被错误地解释为 ASCII 标准已更新为包含超过 128 个字符,或者该术语明确地标识了单个编码,两者都是不真实的。”

标签: java character-encoding console ascii extended-ascii


【解决方案1】:

this question。当 Java 的默认字符编码不是 UTF-8 时——在 Windows 和 OS X 上似乎是这种情况,而不是 Linux——那么无法编码的字符将被转换为问号。您可以将正确的开关(在某些终端上为-Dfile.encoding=UTF-8,但我面前没有 Windows 框)传递给 JVM 的命令行,或者您可以设置一个环境变量。便携地确定这应该是什么可能是不可能的,但是如果您知道您将始终在 Win32 控制台上运行,例如,您可以选择 Charset 在将字符写入标准输出之前显式编码字符,或者您可以直接写下你需要的字节。

【讨论】:

    【解决方案2】:

    Windows 命令提示符默认使用旧的 DOS OEM 编码。 System.out 使用默认系统编码,即 Windows“ANSI”编码。但是,System.console() 会检测到控制台的编码。

    OEM 代码页更可能支持 U+255A (╚),因为这些范围用于 Windows 中的重音字符。

    您可以阅读更多herehereherehere

    就我个人而言,我会避免使用代码页为 65001 的 -Dfile.encoding 选项,因为这会在控制台(批处理文件停止工作)和 Java (bugs) 中产生意想不到的副作用。 p>

    【讨论】:

      【解决方案3】:

      如果您使用的是 Windows,控制台不是 UTF-8 而是 UTF-16,这与 Java 使用的本机编码相同,因此您应该能够直接打印宽字符串。

      我不是 Java 程序员,但对于 C 语言,您必须使用特殊模式 _O_U16TEXT 调用 _setmode(),然后才能真正打印 UTF-16。

      如果您想打印多字节字符串,您可以使用chcp 65001 从命令行将 Windows 控制台设置为 UTF-8,或者从 Win32 API SetConsoleOutputCP() 以编程方式设置,但请注意 WriteFile() 返回的数量的错误写入的字符而不是记录的写入字节数。此错误导致 Windows 控制台上的 UTF-8 被 Perl、PHP 和 Ruby 损坏。我相信即使是 MSVCRT 也会成为受害者。

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 2019-05-15
        • 2020-02-08
        • 2017-09-19
        • 1970-01-01
        • 1970-01-01
        • 2013-05-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多