phpで漢字の正規表現を調べる(utf-8)
の続きです。
※この記事はMacのChromeで表示を確認しています。
以前phpで使える漢字の正規表現を示したところ
異体字セレクターとStandardized Variants
が考慮されていないというご指摘を頂き
知らなかったので調べてみました。
結果正規表現は以下となりました。
preg_match("/^([\x{3005}\x{3007}\x{303b}\x{3400}-\x{9FFF}\x{F900}-\x{FAFF}\x{20000}-\x{2FFFF}][\x{E0100}-\x{E01EF}\x{FE00}-\x{FE02}]?)$/u", $subject, $matches);
前回の記事を参考に正規表現を作ってしまった方ごめんなさい。
##異体字セレクターとは
wikipediaに詳細に書かれていますが、
字形を詳細に表現するためにコードポイントの後ろにくっつく番号です。
例えばあなどるの「侮」という字のコードポイントはFA30ですが、
後ろにE0101をつけると侮󠄁
後ろにE0103をつけると侮󠄃
後ろにFE00をつけると侮︀
となります。
はて、3種類あるけど、E0103とFE00は同じ字形なのになぜ重複しているの?
これはU+E0100〜U+E01EFとU+FE00〜U+FE02とで領域の名前が異なり、
U+E0100~はIVS、U+FE00〜をStandard Variantsといって
新しく追加されたものだからです。
重複で言えばユニコードの歴史は奥深く、重複に重複が重なり
現在悔が3、異体字の侮が2つ登録されています。
しかもwikipediaによれば
漢字の場合、出典が異なれば同一字形であっても別の異体字セレクタが割り当てられることとなっている。
と言っているので、今後異体字セレクタの領域に複数の侮や侮が入ってくる可能性もあります。
表にするとこんな感じです。
種類 | 漢字 | コードポイント | UTF-8 |
---|---|---|---|
統合漢字 | 侮 | 4FAE | E4BEAE |
互換漢字(JIS X 0213由来) | 侮 | FA30 | EFA8B0 |
IVS | 侮󠄃 | 4FAE E0103 | E4BEAE, F3A08483 |
IVS異体字 | 侮󠄁 | 4FAE E0101 | E4BEAE, F3A08481 |
Standard Variants | 侮︀ | 4FAE FE00 | E4BEAE, EFB880 |
前回の記事ではセレクタを考慮していなかったため
正規表現の対象の中に異体字セレクタが混じっていると
4FAEとE0103がバラバラに認識されて、
4FAEは漢字、E0103はなんかわからんもんとして認識されて
全文字漢字と判断したい時にfalseとなります。
###参考
異体字セレクタ - Wikipedia
[CJK互換漢字 - Wikipedia]
(http://ja.wikipedia.org/wiki/CJK%E4%BA%92%E6%8F%9B%E6%BC%A2%E5%AD%97)
異体字セレクター ‐ 通信用語の基礎知識
Standardized Variants
CJK互換漢字 - Wikipedia
Mac OS Xの文字コード問題に関するメモ