UTF-8
仕様
RFC
フォーマット
https://gyazo.com/7947f0a6c96f05735da9d9a5b59c4058
読解用メモ
0xF = 0b1111
0x80 - 0xBF は 6 bit
文字数をカウントする上でのポイント
ASCIIとその他の文字は利用するビット列の範囲が違う
ASCIIは00-7Fまで
ASCII以外は先頭bitがC2-FD
7バイト以上の文字は規定されないため、0xFE、0xFFは使用されない。
先頭バイトとその他のバイト列の利用範囲がかぶらない
よって、先頭バイトの利用範囲に出てくるバイト列の出現回数をカウントすればUTF-8で表現された文字の文字数(Unicodeのcodepointの数)が分かる UTF-8の先頭かを判定する方法
2バイトめ以降は先頭2ビットが10で始まるという事実を利用し、まず各バイトがUTF-8の先頭かどうかを判定し(buf[i] & 0xC0) == 0x80
ASCIIとその他の文字列を構成する出現バイト列を個別に計算して足し合わせればよ
例えばCでカウントするなら
code:c
$counts = count_chars( $str ); // テキストを0-255のbit列の出現回数の配列に分解する
// Count ASCII bytes
for( $i = 0; $i < 0x80; $i++ ) {
}
code:c
// Count multibyte sequence heads
for( $i = 0xc0; $i < 0xFF; $i++ ) {
}
読解用メモ
0xC0 = 0b11000000
0xFF = 0b11111111
文字種
https://gyazo.com/c950c2eb72c3c3168a801000d789f702
マルチバイトはU+0080-U+1FFFFF