MW211 EXIT

devlog
UTF-8/マルチバイト文字の長さ
2012年05月17日
マルチバイト文字(日本語文字)について、
「SHIFT_JIS」は「2バイト」、「UTF-8」は「3バイト」…などと
誤って覚えちゃダメです。
UTF-8のマルチバイト文字は(一文字当たり)、「1バイト~4バイト」なのです。

各バイトの先頭ビット辺りにバイト長の識別子が付加され、
その残りで文字を識別する。
┌────┬──────────────────┐
│1バイト │0_______                            │
├────┼──────────────────┤
│2バイト │110_____ 10______                   │
├────┼──────────────────┤
│3バイト │1110____ 10______ 10______          │
├────┼──────────────────┤
│4バイト │11110___ 10______ 10______ 10______ │
└────┴──────────────────┘

ざっとこんな感じ(なのか?)
┌──────────────────┐  ┌─────────────┐
│0AAAAAAA                            │→│                  0AAAAAAA│
├──────────────────┤  ├─────────────┤
│110AAAAA 10BBBBBB                   │→│         00000AAA AABBBBBB│
├──────────────────┤  ├─────────────┤
│1110AAAA 10BBBBBB 10CCCCCC          │→│         AAAABBBB BBCCCCCC│
├──────────────────┤  ├─────────────┤
│11110AAA 10BBBBBB 10CCCCCC 10DDDDDD │→│000AAABB BBBBCCCC CCDDDDDD│
└──────────────────┘  └─────────────┘

なにかとサニタイズで話題の「/」ですが…。

「/」は「0x2F」なわけだが、以下の四つはすべて「0x2F」=「/」を表すことになる。
上記の法則に照らし合わせてみれば、以下の様々なパターンが該当する。
┌──────┬──────────────────┬
│2F          │00101111                            │
├──────┼──────────────────┼
│C0 AF       │11000000 10101111                   │
├──────┼──────────────────┼
│E0 80 AF    │11100000 10000000 10101111          │
├──────┼──────────────────┼
│F0 80 80 AF │11110000 10000000 10000000 10101111 │
└──────┴──────────────────┴
                                      ┬──────────────────┐
                                      │                           _0101111 │①
                                      ┼──────────────────┤
                                      │                  ___00000 __101111 │②
                                      ┼──────────────────┤
                                      │         ____0000 __000000 __101111 │③
                                      ┼──────────────────┤
                                      │_____000 00000000 00000000 __101111 │④
                                      ┴──────────────────┘

で、①②③は「bin2hex()」で「/」に変換できたが、④は変換できなかった。
「/」を「hex2bin()」で変換すると「2F」となった(最短優先みたい)。
分類:文字コード