これだとLiberalなUTF-8ですね。
[を] UTF-8 の文字にマッチする正規表現UTF-8の文字にマッチする正規表現の素直版。
新旧、というのか、LiberalなUTF-8とStrictなUTF-8の違いは、RFC2044とRFC2279を見ればはっきりします。要はU+11000より上を認めるかどうかということです。今のところUnicode.orgの定義では、U+0000 - U+10FFFF しか認めていないので、そちらの定義に従うと、むしろこの正規表現はさらに短く
$RE_UTF8CHAR_STRICT
= qr/(?:[\x00-\x7f]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3})/;
ないし
$RE_UTF8CHAR_STRICT =
qr{(?: [\x00-\x7f] # 1 byte
| [\xC0-\xDF][\x80-\xBF] # 2 bytes
| [\xE0-\xEF][\x80-\xBF]{2} # 3 bytes
| [\xF0-\xF7][\x80-\xBF]{3} # 4 bytes
)}x;
と書けます。
| 0 | 1 | 2 | 3 | 4 | 5 | offset | |
| 1 | 0xxxxxxx | ||||||
| 2 | 110xxxxx | 10xxxxxx | |||||
| 3 | 1110xxxx | 10xxxxxx | 10xxxxxx | ||||
| 4 | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | |||
| 5 | 111110xx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | ||
| 6 | 1111110x | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | |
| bytes/char |
ただし、これも実は厳密ではなくて、これだとSurrogate Pairの領域(U+D800 - U+DFFF)も入ってしまいますが、まあ普通そこまでやらんでもいいでしょう。
Dan the Man with Too Many Encodings to Support
追記: 成瀬さんからTBが。
はてなるせだいあり - [Char]UTF-8の正規表現もっと厳密にしますと
これはすごい。となると、
ここからさらにU+FFFEやU+FFFFが無い、というのも考慮するとうれしい日もあるかもしれません。いや、無いかな。
というのにも対応した奴が欲しくなりますよねえ。というわけで以下に。
$RE_UTF8CHAR_VALID =
qr{(?: [\x00-\x7F] # U+0000 - U+007F
| [\xC2-\xDF][\x80-\xBF] # U+0080 - U+07FF
| \xE0[\xA0-\xBF][\x80-\xBF] # U+0800 - U+0FFF
| [\xE1-\xEC][\x80-\xBF]{2} # U+1000 - U+CFFF
| \xED[\x80-\x9F][\x80-\xBF] # U+D000 - U+D7FF
| \xEF[\x80-\xBF][\x80-\xBD] # U+E000 - U+FFFD
| \xF0[\x90-\xBF][\x80-\xBF]{2} # U+10000 - U+3FFFF
| [\xF1-\xF3][\x80-\xBF]{3} # U+40000 - U+FFFFF
| \xF4[\x80-\x8F][\x80-\xBF]{2} # U+100000 - U+10FFFF
)}x;
ちなみに、Encode.pmのutf-8-strictでは、このレベルのチェックまでやってます。
self memo : 2006-03-11RFCとにらめっこしなかった自分が恥ずかしい。
さすがに$RE_UTF8CHAR_MAPPED{4.1}とかいうのはご勘弁を;-)
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。