gpt4 book ai didi

java - 将 Unicode (CJK ExtB) 字符转换为 Java/Scala 中的十进制 NCR

转载 作者:行者123 更新时间:2023-11-29 10:06:55 25 4
gpt4 key购买 nike

我正在尝试将 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个字节。

最佳答案

Java(以及 Scala)对其字符串使用 UTF-16 编码,这意味着 2^16-1 以上的所有 unicode 代码点必须用两个字符表示。 (实际上,编码方案是 bit more complex than that。)无论如何,length 是一种在较低级别(字符)上运行的方法,因此它返回字符数。

如果你想找出代码点的数量,当你说“两个 unicode 字符”(例如打印出的两个符号)时,你可能会凭直觉想到这一点,你需要使用 。 codePointCount(0,s.length)。如果您想将它们转换为十六进制,则需要使用代码点而不是 Char,因为并非所有代码点都适合。我对 this question 的回答包含将字符串转换为代码点的 Scala 代码。 (没有达到最高效率;如果您要对大型字符串进行繁重的文本处理,您会希望重写它以使用数组/ArrayBuffer。)

关于java - 将 Unicode (CJK ExtB) 字符转换为 Java/Scala 中的十进制 NCR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5217953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com