【问题标题】:finding unicode for non-english characters查找非英语字符的 unicode
【发布时间】:2010-01-17 06:51:00
【问题描述】:

我必须在 Java 程序中打印一个非英语字符串。我有绳子。如何获取其组成字符的 unicode,以便将字符串嵌入程序中?

【问题讨论】:

    标签: java unicode


    【解决方案1】:

    您在哪个代码页中有该字符串? Java 源代码可以采用任何编码,因此您可以将该字符串直接放在源代码中并使用编译器的选项来设置代码页。请参阅 NetBeans -> 项目节点 -> 属性 -> 源 -> 编码。

    【讨论】:

    • 我在 Mac 上使用 Eclipse。源文件使用“MacRoman”进行编码(从项目属性 -> 资源 -> 文本文件编码中找到)。我将其更改为“UTF-8”,然后尝试将实际的非英语字符串嵌入到程序中并尝试打印。有效。你能解释一下基本概念吗?
    【解决方案2】:

    源文件正在使用“MacRoman”进行编码(从项目属性 -> 资源 -> 文本文件编码中找到)。我将其更改为“UTF-8”,然后尝试将实际的非英语字符串嵌入到程序中并尝试打印。成功了。

    您可能在保存或编译期间损坏了数据。源代码不携带任何内在编码信息,因此很容易损坏包含基本“ASCII”范围之外的字符的字符串文字。考虑在源文件中使用Unicode escape sequences 以避免此问题。 您要么这样做,要么确保与源接触的任何人始终适当地处理它 - 第一种方法更容易。

    如果这是用于商业应用程序,请考虑将字符串外部化到资源文件中。

    【讨论】:

    • 我很欣赏您的观点,但我无法完全理解:您在嵌入 unicode 字符串时究竟看到了什么问题?我认为这会更清晰......触摸代码的人会立即看到他们正在做的事情,而 unicode 转义序列不会出现这种情况。顺便说一句,这是一个有趣的项目。并感谢这些链接
    • 对于一系列(大部分)英文字母字符,编码字符的字节值对于编码为 UTF-8、MacRoman 或 Windows-1252 的文件是相同的。但是,像 À (\u00C0) 这样的字符将分别存储为字节 C3 80CBC0。将文件复制到另一台 PC 需要您记录编码,以便其他人可以正确编辑和编译代码。这不是一个大问题 - 如果您正在编写非英语应用程序,这可能是最好的方法。
    【解决方案3】:

    正如之前的答案所说,您绝对可以直接在源文件中编写包含无法以传统 ISO-8859-1 或 US-ASCII 字符集编码的字符的字符串。您确实需要确保您的 IDE 将文件保存为 UTF-8。而且,您可能需要在 javac 命令中添加“-encoding UTF-8”以确保 javac 正确读取它。

    但我想你想知道如何使用“\uXXXX”语法嵌入字符串,也许是为了避免源文件编码的任何问题。这个短代码 sn-p 可能对你有用;它粗略地假设任何 UTF-16 值超过 255 的字符都需要转义。

    public static void main(String[] args) {
      String s = args[0];
      for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        int value = (int) c;
        if (value < 256) {
          System.out.print(c);
        } else {
          System.out.print("\\u" + Integer.toHexString(value));
        }
      }
    }
    

    【讨论】:

    • @Sean Owen - 我会选择 U+007F (127) 以外的任何值。
    【解决方案4】:
    python -c "print repr('text goes here'.decode('utf-8'))"
    

    它可能并不总是'utf-8',但这是一个合理的起点。

    【讨论】:

    • 试过这个: python -c "p​​rint repr(u'श्रावण')" 这是我得到的输出: u'\xe0\xa4\xb6\xe0\xa4\xb6\xe0\xa5\ x8d\xe0\xa4\xb0\xe0\xa4\xbe\xe0\xa4\xb5\xe0\xa4\xa3' (注意:当我在上面的命令中尝试 string.decode('utf-8') 时,我得到一个错误说 ascii 编解码器无法解码位置 0-17 中的字符。)我复制了获得的结果并粘贴到我的 java 程序中。我不能这样使用它(字符串是这样打印的,而不是相应的字符)。然后,我将结果中的每个实体从 \xab 形式转换为 \u00ab。在我这样做之后,结果就差远了..
    • ..原始字符串。知道有什么问题吗?我必须怎么做才能使用生成的 unicode 从我的程序中打印原始字符串?任何帮助都会很棒。
    • 如果您使用.decode(),请删除字符串文字开头的u。你得到的第一个输出是 UTF-8 格式的字符串。
    • 在开头没有'u'的情况下尝试过。这次命令奏​​效了。但是当我将它粘贴到我的 java 程序中并尝试打印时,它只会打印一系列问号..除了将代码粘贴为字符串文字之外,我还需要做些什么吗?
    • 我不知道。但这可能只是您的终端/控制台无法打印出梵文字符,因此正在执行“无效字符”替换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多