CJK ExtB プランの Unicode 文字を含む Java 文字列を Decimal 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?
ご覧のとおり、最初のケースでは 3 つの Unicode 文字が 3 つの NCR に正しく変換されます。
しかし、2 番目のケース「懷」では、Unicode 文字は 2 つしかありませんが、Java/Scala は 3 つの文字を含む文字列と見なしているようです。
では、ここで何が起こっているのでしょうか。また、私が言及したサイトのコンバーターと同じように、2 番目のケースを正しく変換するにはどうすればよいでしょうか? どうもありがとう。
アップデート:
- 私のソース コード ファイルは UTF-8 を使用しています。
- これが "懷".toCharArray() の結果です
char[] = ?, char.toInt = 55390
char[] = ?, char.toInt = 56743
char[] = 懷, char.toInt = 25079
今、私は何が起こったのか知っていると思います。文字 "" は UTF-16 で 0xD85E 0xDDA7 としてエンコードされ、2 バイトではなく 4 バイトになります。char
そのため、データ型が 2 バイトしか表現できないchar の配列に変換すると、2 つの要素が必要になります。