Java中unicode在哪里可以找到N字节的unicode字符示例?

6

我正在寻找1字节、2字节、3字节、4字节、5字节和6字节的Unicode字符样本。如果有任何关于所有不同Unicode字符及其大小(以字节为单位)的参考链接,那将非常感激。我希望这个参考还包括像 \uXXXXX 这样的代码点。

4个回答

8

正如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块是不正确、错误和愚蠢的。您需要将其解码为单个代码点,并生成一个单个代码点作为返回值。否则,您将得到错误的答案。 - tchrist
问题在于,当他们这样做时,那不是UTF-8编码。它是CESU-8编码,这个错误非常普遍以至于Unicode标准不得不提到它。它不是UTF编码,因此不应该用于外部数据交换。特别是在Unicode技术报告26中明确说明,“不打算也不建议将其用作开放信息交换的编码”。这是一个错误,Windows和/或Java用户如果不注意可能会搞砸的愚蠢事情之一。 - tchrist
2
不,它不是有效的UTF-8。这就是我在我的答案中所说的。你似乎非常强烈地同意我。虽然我不知道CESU-8 TR,但这是一个很好的信息,谢谢。 - Cowan
当然,Java有一个“writeUTF”方法写入这种垃圾也没有帮助。 :) - Hakanai

8
“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表示的参考,请查看fileformat.info上的表格。另请参见:

谢谢,这是一个很好的开端! - Mohamed Nuur
@Mohamed Nuur 你也可以看看这两个网站:Unicode字符表,它具有使用描述性名称的整洁查找功能;或者,如果你对基本ASCII集感兴趣,可以尝试查找表 - Neil Dunlop

3

3
这些并没有告诉我这些码点表示多少字节。我在哪里可以找到这个信息? - Mohamed Nuur
@Mohamed:看看维基百科上的UTF-8,设计部分文章。它将给出Unicode代码点值和其在UTF-8表示中的长度之间的对应关系。这是唯一一个具有超过四个字符的编码方式。 - Mat
换句话说,没有5个或更多字节的UTF-8字符?根据维基百科文章,它们停留在4个字节。 - Mohamed Nuur
@Mohamed,是的,没错。UTF-8编码的字符理论上可以长达六个字节,但16位BMP字符最多只有三个字节长。 - Andrey Adamovich
1
@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个字节。 - tchrist

1

对�那些�需��际样本的人,这里有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个字节。也许有人可以解释一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接