UTF-16の求め方
UTF-16の求め方
1. 符号化したい文字の符号位置をnとする
2. 符号位置nの上限を0x10FFFFとする
2.1. n < 0x10000なら16ビット符号なし整数としてそのまま終了(BMP内)
2.2. n >= 0x10000なら以下のルールに従ってサロゲートペアを求める
n1 = n - 0x10000
= yyyy yyyyyyXX XXXXXXXX
= yyyyyyyyyy XXXXXXXXXX ... (10桁ずつに揃える、yを上位、Xを下位に使う)
w1 = 0xD800 + yy yyyyyyyy
= 11011000 00000000 + yy yyyyyyyy
w2 = 0xDC00 + XX XXXXXXXX
= 11011100 00000000 + XX XXXXXXXX
w1が上位サロゲート、w2が下位サロゲート
ビット演算子をちゃんと使って求めてみる
code:js
function getUTF16ByteArray(word) {
const cp = word.codePointAt(0);
if (cp < 0x10000) {
return cp;
} else if (0x10000 <= cp && cp <= 0x10FFFF) {
// サロゲートペア算出
lowSurrogate = 0xDC00 + ((cp - 0x10000) & 0b1111111111)
highSurrogate = 0xD800 + (((cp - 0x10000) >> 10 ) & 0b1111111111)
return highSurrogate, lowSurrogate;
} else {
return [];
}
}
code:ㅤ
console.log(getUTF16ByteArray('𩸽').map(m => m.toString(16)))
// (2) 'd867', 'de3d'
関連
UnicodeのAをUTF-16で求める
UnicodeのΩをUTF-16で求める
Unicodeの愛をUTF-16で求める
Unicodeの𩸽をUTF-16で求める