好吧,讓我們不要混淆一些東西。
第一個字節爲0xf0
的UTF-8字符長度爲4個字節,這是編碼合法Unicode字符所需的最多的字符。由於超過94%的可能的Unicode範圍需要第四個字節,因此0xf0
不映射到任何單個代碼頁,當然也不映射到專用區。
這樣的字符是以外的Basic Multilingual Plane。但這不同於無效或私人使用;這隻意味着它們的代碼點大於U + FFFF(十進制值65,535)。
如果你想排除外界BMP所有的字符,你應該尋找匹配這個表達式的那些:
[\x{10000}-\x{10FFFF}]
使用Perl的\x{
... }
插語法用十六進制代碼,包括字符點值。如果你真的在使用Perl,那麼爲了便於使用,你可能想把正則表達式放入一個變量中(使用quote-regex構造qr(
... )
,因爲裸斜槓會立即嘗試在賦值時與$_
匹配時間):
my $not_bmp = qr([\x{10000}-\x{10FFFF}]);
但同樣,匹配的正則表達式刪除字符有效避免了可能的Unicode字符的94%,因此可以肯定這就是你想要的。
如果你真的只想消除私人使用字符 - 其中一些是裏面的 BMP - 只是特別排除這些範圍。使用Perl或Python或任何其他支持UTF-8的語言,您不必擔心字節;只需檢查代碼點。
由於Wikipedia會告訴你,這三個私人使用區域,在這些代碼點範圍:
- 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字符匹配,包括通過代碼點在字符串中的字符等)。例如,這裏的Ruby,主要區別在於使用\u{...}
代替\x{...}
的插值:
not_bmp = %r([\u{10000}-\u{10FFFF}])
pua = %r([\u{e000}-\u{f8ff}\u{f0000}-\u{fffff}\u{100000}-\u{10ffff}])
的Python \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 –