UnicodeとUtf-8符号化の相互変換

1734 ワード

最近ちょうどunicode符号化の変換を使うので、phpのライブラリ関数を調べてみると、文字列に対してUnicodeの符号化と復号を行う関数が見つからなかった!まあ、見つからなかったら自分で叶えてみよう..
UnicodeとUtf-8符号化の違いUnicodeは1つの文字セットであり、UTF-8はUnicodeの1つであり、Unicodeは一定長で2バイトであり、UTF-8は可変であり、漢字にとってUnicodeが占有するバイトはUTF-8が占有するバイトより1バイト少ない.Unicodeは2バイト、UTF-8は漢字が3バイトです.UTF-8符号化文字は理論的には最大6バイトまで可能であるが、16ビットBMP(Basic Multilingual Plane)文字は最大3バイトまでしか使用できない.UTF-8コード表を見てみましょう.
u-00000000 - U-0000007F: 0xxxxxxx 
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx 
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 

xxxの位置は文字符号化数のバイナリで表されるビットで埋め込まれ、右側のxほど特殊な意味が少なく、最短の文字符号化数を表すのに十分なマルチバイト列しかありません.なお、マルチバイト列では、最初のバイトの先頭「1」の数が、列全体のバイト数である.一方,1行目は0で始まるが,ASCII符号化に対応するため1バイト,2行目は2バイト文字列,3行目は漢字のように3バイトである,ということである.(個人的には、前の1の個数をバイト数と簡単に見ることができると思います)
UnicodeはどのようにUtf-8に変換しますか?
UnicodeをUTF-8に変換するには、彼らの違いがどこにあるのかを知る必要があります.次にUnicodeでの符号化はどのようにUTF-8に変換されるのかを見てみましょう.UTF-8では、1文字のバイトが0 x 80(128)未満であればASCII文字で、1バイトを占めています.UTF-8はASCII符号化に互換性があるため、変換しなくてもいいです.Unicodeで漢字「あなた」の符号化が「u 4 F 60」であれば、上表のU-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx区間と照らし合わせて3バイトで記憶し、それを2進数100111101100000に変換し、446ビットで切断してから対応する2進数を補う.
unicode: 100111101100000                  4F60
    :100 , 111101,100000              
  :    *1110*0100 , *10*111101,*10*100000 **     
utf-8:    11100100,10111101,10100000       E4BDA0

上からUnicodeからUTF-8への変換が直感的にわかりますが、もちろんUTF-8のフォーマットを知っていれば逆演算が可能になります.フォーマットに従ってバイナリの対応する位置から取り出し、変換すると得られるUnicode文字になります(この演算は「シフト」でできます).