【发布时间】:2009-12-21 17:56:44
【问题描述】:
Java 的 char 是 16 位的,但 Unicode 有更多的字符 - Java 是如何处理的?
【问题讨论】:
Java 的 char 是 16 位的,但 Unicode 有更多的字符 - Java 是如何处理的?
【问题讨论】:
http://en.wikipedia.org/wiki/UTF-16
在计算中,UTF-16(16 位 UCS/Unicode 转换格式)是 变长字符编码 对于 Unicode,能够编码 整个 Unicode 曲目。这 编码形式将每个字符映射到 16 位字的序列。人物 被称为代码点和 16 位字称为代码单元。 对于 Basic 中的字符 多语言平面 (BMP) 结果 编码是单个 16 位字。为了 其他位面的角色, 编码将导致一对 16 位字,合称为 代理对。所有可能的代码 从 U+0000 到 U+10FFFF 的点, 除了代理代码点 U+D800–U+DFFF(不是 个字符),唯一地映射为 UTF-16 与代码点无关 当前或未来的字符分配 或使用。
【讨论】:
Java 字符串是 UTF-16(大端),因此 Unicode 代码点可以是一个或两个字符。在这种编码下,Java 可以使用字符 0xD835 0xDD0A(字符串文字 "\uD835\uDD0A")来表示代码点 U+1D50A(MATHEMATICAL FRAKTUR CAPITAL G)。 Character 类提供了与代码点相互转换的方法。
// Unicode code point to char array
char[] math_fraktur_cap_g = Character.toChars(0x1D50A);
【讨论】:
int 类型math_fraktur_cap_g 来读取非BMP 的代理对?如上所述here
Java 对字符串使用 UTF-16 - 基本上意味着字符是可变宽度的。它们中的大多数适合 16 位,但基本多语言窗格之外的那些占用 32 位。与 UTF-8 方案非常相似。
【讨论】: