【问题标题】:Java unicode where to find example N-byte unicode charactersJava unicode 在哪里可以找到示例 N 字节 unicode 字符
【发布时间】:2011-08-29 02:54:23
【问题描述】:

我正在寻找示例 1 字节、2 字节、3 字节、4 字节、5 字节和 6 字节 unicode 字符。任何指向所有不同 unicode 字符的某种引用的链接以及它们有多大(按字节)将不胜感激。我希望这个参考也有像\uXXXXX这样的代码点。

【问题讨论】:

    标签: java unicode sample-data codepoint


    【解决方案1】:

    没有“1 字节、2 字节、3 字节、4 字节、5 字节和 6 字节的 unicode 字符”之类的东西。

    您可能会谈论 Unicode 字符的 UTF-8 表示。类似地,Java 中的字符串在内部是用 UTF-16 表示的,所以 Java 的char 类型代表了一个 UTF-16 的 16 位代码单元,每个 Unicode 字符可以由其中一个或两个这些代码单元来表示,并且每个代码单元可以在字符串文字中表示为\uxxxx(请注意,这些序列中只有 4 个十六进制数字,因为代码单元是 16 位长)。

    因此,如果您需要 Unicode 字符及其 UTF-8 和 UTF-16 表示形式的参考,您可以查看the table at fileformat.info

    另请参阅:

    【讨论】:

    • 谢谢,这是一个很好的开始!
    • @Mohamed Nuur 您还可以查看这两个站点:unicode character table,它具有使用描述性名称的简洁查找功能,或者,如果您对基本 ASCII 集感兴趣,请尝试 lookup tables跨度>
    【解决方案2】:

    正如 axtavt 所指出的,n 字节 Unicode 字符的概念是没有意义的;假设您的意思是 UTF-8,那么可能会帮助您进行测试等的一个非常简单的表可能如下所示。请注意,所有示例字符都可以在我的浏览器(Ubuntu 上的 Chrome)上使用,但您的里程可能会在显示、复制/粘贴等方面有所不同。

    UTF-8 bytes  Start    End       Example Character
    1            U+0000   U+007F    ! EXCLAMATION MARK U+0021)
    2            U+0080   U+07FF    ¶ PILCROW SIGN (U+00B6)
    3            U+0800   U+FFFF    ‱ PER TEN THOUSAND SIGN (U+2031)
    4            U+10000  U+1FFFFF  ??? MUSICAL SYMBOL SIXTEENTH NOTE (U+1D161)
    

    理论上,UTF-8 中可以有 5 个或 6 个字节的值,但 Unicode 的 32 位地址空间实际上被限制为最大 10FFFF,因此不需要超过 4 个字节。

    请注意,这里有一个重要的警告:Java 的 char 不是 Unicode 字符;它是 UTF-16 的 16 位代码单元,经常看到将非 BMP 字符(如上面的 U+1D161)视为 2 个字符的数据流,并相应地使用 UTF-8。例如:

    Character: U+1D161
    UTF-8 encoding: 0xF0 0x9D 0x85 0xA1
    UTF-16 encoding: 0xD834 0xDD61
    UTF-16 code points individually encoded as UTF-8: 0xED 0xA0 0xB4 0xED 0xB5 0xA1
    

    请注意,这具有显然显示 6 字节 UTF-8 字符的效果,但实际上 UTF-8 不允许这样做。 UTF-8 必须是原始代码点的编码,而不是代表这些点的 UTF-16 代码单元的编码。这并不意味着你在野外看不到它......

    【讨论】:

    • 取一个占用两个 UTF-16 块的代码点并从中生成两个 UTF-8 块是不正确、损坏和愚蠢的。您需要将其解码回单个代码点并生成单个代码点作为回报。 否则你会得到错误的答案
    • 问题是,当他们这样做时,那不是 UTF-8。它是 CESU-8,这是一个非常常见的错误,以至于 Unicode 标准不得不提及它。它不是 UTF,因此永远不应该用于外部数据交换。特别是It is not intended nor recommended as an encoding used for open information exchange。这是一个错误,是 Windows 和/或 Java 人不注意的那些愚蠢的事情之一。
    • 不,它不是有效的 UTF-8。我在回答中说。你似乎非常强烈地同意我的观点。虽然不知道 CESU-8 TR,但很好的信息,谢谢。
    • 当然,Java 有一个写入垃圾的“writeUTF”方法也无济于事。 :)
    【解决方案3】:

    【讨论】:

    • 这些并没有告诉我这些代码点代表多少字节。我在哪里可以找到这个?
    • @Mohamed:查看 Wikipedia 上的 UTF-8, Design section 文章。它将为您提供 Unicode 代码点值与其 UTF-8 表示形式的长度之间的对应关系。这是唯一超过四个字符的编码。
    • 也就是说,没有 5+ 字节的 utf-8 字符?根据维基百科的文章,他们停在 4 点。
    • @Mohamed,是的,没错。 UTF-8 编码字符理论上最长可达 6 个字节,但 16 位 BMP 字符最长可达 3 个字节。
    • @Mohamed: perl -CS -e 'print chr(0x101)' | wc -c 打印 2,perl -CS -e 'print chr(0x1020)' | wc -c 打印 3,perl -CS -e 'print chr(0x1F608) | wc -c 打印 4。对于 UTF-8 编码相应的代码点,这些答案以字节为单位。最高的合法 Unicode 代码点是 0x10FFFF,但 UTF-8 可以 编码更大的代码点。例如,在 64 位机器上:perl -CS -e 'print chr(0xFFFF_FFFF_FFFF_FFFF)' | wc -c 报告 13 个字节。
    【解决方案4】:

    对于那些只追求实际样品的人 这里有 4 个样本。

    1. a(1 个字节,0x61)
    2. µ(2 字节,0xb5)
    3. →(3 个字节,0x2192)
    4. ?(4 字节,0x1f431)

    https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=ee0883bad3b1204f45889ea450a53cf4

    我不完全确定为什么 0xb5 是 2 个字节而 0x2192 是 3 个字节。也许有人可以解释一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 2013-01-31
      • 1970-01-01
      相关资源
      最近更新 更多