LoginSignup
17
16

More than 5 years have passed since last update.

phpでの漢字の正規表現を調べる続き~異体字セレクタ

Last updated at Posted at 2015-01-23

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
異体字セレクター ‐ 通信用語の基礎知識
Standardized Variants
CJK互換漢字 - Wikipedia
Mac OS Xの文字コード問題に関するメモ

17
16
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
16