UTF-8メモ
UTF-8 でマルチバイトになる場合について、実装するときいつも調べてる気がするので メモしておこうかなと。
バイト数 | 1 バイト目 | 2 バイト目 | 3 バイト目 | 4 バイト目 |
---|---|---|---|---|
1 | 0xxxxxxx |
- | - | - |
2 | 110xxxxx |
10xxxxxx |
- | - |
3 | 1110xxxx |
10xxxxxx |
10xxxxxx |
- |
4 | 11110xxx |
10xxxxxx |
10xxxxxx |
10xxxxxx |
Unicode のコードポイントは 1 バイト目から順番に x
の部分を連結したものになる
(一応順番的にはビッグエンディアン)。
規格上は 6 バイトまで考慮されてるらしいが、現状で存在するのは 4 バイトまでっぽい。 絵文字とかあからさまにコードポイント節約しに来てる感あるしな (知らんけど)。
文字数
UTF-8 で文字数と言ったときに僕の理解でも指す概念が 3 つくらいあって、
- バイト数
- コードポイントの数
- 見た目の文字数 (サロゲートペアとかを考慮した結果の)
下に行くほど判定が面倒臭くて、見た目の文字数を数えるには文字種を見て 連結する条件のテーブル引く必要がある。絵文字で J と P 並べたら日本の国旗になるとか。
てかコードポイントの符号化は折角途中のバイトを判定できるようにしたのに そういうところで曖昧さがあるのなんだかな、という気持ちになるな…。
ここにフォントとかが入ってくるとリガチャとかで文字数の概念がもう一個増える気がする。
文字コード判定
Shift_JIS か UTF-8 かくらいの判定を実装したいんだけど、UTF-8 の符号化的に妥当かどうかで判定していいんだろうか。 UTF-8 的に valid な Shift_JIS のシーケンスがあまりに多いと使い物にならないしな…。ま、でもそこは妥協か。