[OK]をいくつか混在しないでください。
最初のバイトが0xf0
であるUTF-8文字は4バイト長です。正式なUnicode文字をエンコードするのに最も必要なものです。可能なUnicode範囲の94%以上が4番目のバイト0xf0
が単一コードページにはマッピングされず、私的使用領域にはマッピングされないことが必要なためです。
このような文字は、Basic Multilingual Planeの外側のです。しかし、これは無効または私的使用とは異なります。コードポイントがU + FFFF(10進値65,535)よりも大きいことを意味します。
あなたはBMP外のすべての文字を除外したい場合は、この正規表現に一致するものを検索する必要があります。
[\x{10000}-\x{10FFFF}]
その進コードで文字を含めるように... }
補間構文をPerlの\x{
を使用していますポイント値。あなたが実際にPerlを使用しているなら、使いやすさのために、正規表現を変数に入れたいかもしれません(引用符正規表現の構造qr(
... )
、裸のスラッシュは代入時に正規表現とすぐに一致するようにしようとします)時間):
my $not_bmp = qr([\x{10000}-\x{10FFFF}]);
しかし、再び、その正規表現にマッチする文字を削除することは可能のUnicode文字の94%以上を除去し、そのために何をしたいのです確認してください。
BMPの中にある専用の文字を除外したい場合は、その範囲を特に除外します。 PerlやPythonや他のUTF-8対応言語では、バイトを心配する必要はありません。コードポイントをチェックするだけです。 Wikipediaとして
は3つのプライベート使用領域がこれらのコード・ポイントである、ことを教えてくれます範囲:
- U + E000..U + F8FF
- U + F0000..U + FFFFF
- U + 100000..U + 10FFFF
ので、対応するPerlの正規表現は次のようになります。
my $pua = qr([\x{e000}-\x{f8ff}\x{f0000}-\x{fffff}\x{100000}-\x{10ffff}]);
他の言語の多くは、Unicodeのサポートが類似しています(コードポイントによる文字列内の文字を含むUTF-8文字とのマッチングなど)。例えば、ここでは主に補間のため\u{...}
を使用しての代わりに、\x{...}
が異なるルビー、です:
not_bmp = %r([\u{10000}-\u{10FFFF}])
pua = %r([\u{e000}-\u{f8ff}\u{f0000}-\u{fffff}\u{100000}-\u{10ffff}])
のPythonだけ正確に4進数で動作エスケープ\u
が、あなたはのpython3持っている場合 - またはPython2をワイドでコンパイルモード - 大文字の\U
を使用することができますが、これは正確に8つです({
で可変長サポートはありません...}
)しているPerlやRubyなど:
not_bmp = re.compile(u'[\U00010000-\U0010ffff]')
pua = re.compile(u'[\ue000-\uf8ff\U000f0000-\U000fffff\U00100000-\U0010ffff]')
私の質問には、デモデータを自分のコードにどうやって入れるのですか? :D – simbabque
@simbabque Pastbin for you http://pastebin.com/LR0StPHu –