我正在尝试将包含 CJK ExtB 计划中的 Unicode 字符的 Java 字符串转换为十进制 NCR。
例如(您可以尝试使用http://people.w3.org/rishida/tools/conversion/):
- “游钖堃”应转换为
游鍚堃
- “怀”应该转换为
𧦧懷
这是我尝试过的(在 Scala 中):
def charToHex(char: Char) = "&#%d;" format(char.toInt)
def stringToHex (string: String) = string.flatMap(charToHex)
println (stringToHex("游鍚堃")) // 游鍚堃
println (stringToHex("懷")) // ��懷
println ("懷".toCharArray().length) // Why it is 3?
如您所见,它在第一种情况下正确转换,将三个 unicode 字符转换为三个 NCR。
但是在第二种情况“怀”中,只有两个unicode字符,但是Java/Scala似乎认为它是一个包含三个字符的字符串。
那么,这里发生了什么,我怎样才能像我提到的网站上的转换器一样正确转换第二种情况?非常感谢。
更新:
- 我的源代码文件使用的是 UTF-8。
- 这是 "怀".toCharArray() 的结果
char[] = ?, char.toInt = 55390
char[] = ?, char.toInt = 56743
char[] = 懷, char.toInt = 25079
现在我想我知道发生了什么。字符“”在 UTF-16 中编码为 0xD85E 0xDDA7,是 4 个字节而不是 2 个字节。所以转换为char数组时需要2个元素,其中数据类型char
只能表示2个字节。