Java unicode 在哪里可以找到示例 N 字节 unicode 字符
Posted
技术标签:
【中文标题】Java unicode 在哪里可以找到示例 N 字节 unicode 字符【英文标题】:Java unicode where to find example N-byte unicode characters 【发布时间】:2011-08-29 02:54:23 【问题描述】:我正在寻找示例 1 字节、2 字节、3 字节、4 字节、5 字节和 6 字节 unicode 字符。任何指向所有不同 unicode 字符的某种引用的链接以及它们有多大(按字节)将不胜感激。我希望这个参考也有像\uXXXXX
这样的代码点。
【问题讨论】:
【参考方案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。
另请参阅:
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) Unicode - How to get the characters right? A to Z Index of Unicode Characters【讨论】:
谢谢,这是一个很好的开始! @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】: 看看这个:http://en.wikipedia.org/wiki/List_of_Unicode_characters。 还有这个:http://www.unicode.org/charts/。【讨论】:
这些并没有告诉我这些代码点代表多少字节。我在哪里可以找到这个? @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 个样本。
-
a(1 个字节,0x61)
µ(2 字节,0xb5)
→(3 个字节,0x2192)
?(4 字节,0x1f431)
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=ee0883bad3b1204f45889ea450a53cf4
我不完全确定为什么 0xb5 是 2 个字节而 0x2192 是 3 个字节。也许有人可以解释一下。
【讨论】:
以上是关于Java unicode 在哪里可以找到示例 N 字节 unicode 字符的主要内容,如果未能解决你的问题,请参考以下文章
我在哪里可以找到一些好的 Android UI 示例? [关闭]
在哪里可以找到 Java XML 框架的详细比较? [关闭]