unicode - utf 8 手動將 unicode codepoints轉換為 utf 8 和 UTF 16

  显示原文与译文双语对照的内容
118 5

我有一個大學的編程考試,一個部分是 unicode 。

我已經經檢查了這個問題,我的演講者無用,所以這是幫助你們的最後一個辦法。

這個問題將是類似的:

字元串'mЖ麗'有這些 unicode codepoints U+006DU+0416U+4E3D,用十六進位編寫答案,手動將字元串編碼為 UTF-8 和 UTF-16.

任何幫助都會大大感謝,因為我正在嘗試讓我的頭繞著這個。

时间:原作者:0个回答

109 5

一方面,我很高興知道大學課程正在學習字元編碼,但實際上知道 UTF-8 編碼規則很好。( 它能幫助學生通過土耳其測試)?

到目前為止,對於將 UCS codepoints編碼到 UTF-8的規則來說,最清晰的描述是來自許多Linux系統的utf-8(7) 頁面:

Encoding
 The following byte sequences are used to represent a
 character. The sequence to be used depends on the UCS code
 number of the character:
 0x00000000 - 0x0000007F:
 0xxxxxxx
 0x00000080 - 0x000007FF:
 110xxxxx 10xxxxxx
 0x00000800 - 0x0000FFFF:
 1110xxxx 10xxxxxx 10xxxxxx
 0x00010000 - 0x001FFFFF:
 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
 [... removed obsolete five and six byte forms.. .]
 The xxx bit positions are filled with the bits of the
 character code number in binary representation. Only the
 shortest possible multibyte sequence which can represent the
 code number of the character can be used.
 The UCS code values 0xd800–0xdfff (UTF-16 surrogates) as well
 as 0xfffe and 0xffff (UCS noncharacters) should not appear in
 conforming UTF-8 streams.

記住圖表的'壓縮'版本可能會更容易:

初始位元組開始於錯誤的codepoints開始以 1 開頭,並添加填充 1+0後續位元組開始 10

0x80 5 bits, one byte
0x800 4 bits, two bytes
0x10000 3 bits, three bytes

通過注意在新表示中允許的位數,你可以通過注意空間來派生範圍:

2**(5+1*6) == 2048 == 0x800
2**(4+2*6) == 65536 == 0x10000
2**(3+3*6) == 2097152 == 0x200000

我知道 remember derive圖表的規則,比圖表本身容易得多。希望你能很好地記住規則。: )

更新

建立圖表后,可以通過在它的範圍內找到輸入 Unicode codepoints,再從十六進位轉換成二進位,再根據上面的規則插入位,然後轉換回十六進位,從而轉換為 UTF-8:

U+4E3E

這適用於 0x00000800 - 0x0000FFFF 範圍( 0x4E3E <0xFFFF ),因此表示形式將為:

 1110xxxx 10xxxxxx 10xxxxxx

0x4E3E100111000111110b 將這些位放到( 從右邊開始,我們會在開始時用 0 填充丟失的位) 上面的x 中:

 1110x100 10111000 10111110

在開始處還有一個 x 位置,用 0 填充它:

 11100100 10111000 10111110

位轉換為十六進位字元:

 0xE4 0xB8 0xBE
原作者:
...