Хорошо, давайте не будем смешивать несколько вещей.
UTF-8 символы, первый байт которых 0xf0
имеют длину в четыре байта, что вам больше всего нужно, чтобы закодировать юридический символ Юникода. Поскольку для более чем 94% возможного диапазона Unicode требуется этот четвертый байт, 0xf0
не привязывается к какой-либо одной кодовой странице и, конечно же, не относится к частным областям.
Такие символы являются за пределами Basic Multilingual Plane. Но это отличается от недействительности или частного использования; это просто означает, что их кодовые точки больше U + FFFF (десятичное значение 65 535).
Если вы хотите, чтобы исключить все символы вне BMP, вы должны искать для тех, соответствующих данного регулярного выражения:
[\x{10000}-\x{10FFFF}]
, который использует \x{
... }
интерполяции синтаксис Perl, чтобы включать в себя символы их шестнадцатеричного код точечное значение. Если вы на самом деле используете Perl, то для удобства использования вы можете поместить регулярное выражение в переменную (используя конструкцию quote-regex qr(
... )
, так как голой слэш немедленно попытается сопоставить регулярное выражение с $_
при назначении время):
my $not_bmp = qr([\x{10000}-\x{10FFFF}]);
Но, опять же, удаление символов, соответствующих этому регулярное выражение устраняет более 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, включая символы в строке по кодовой точке и т. Д.). Например, вот Руби, которая в основном отличается использованием \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
, который занимает ровно восемь (нет поддержки переменной длины через {
...}
, как Perl и Руби есть):
not_bmp = re.compile(u'[\U00010000-\U0010ffff]')
pua = re.compile(u'[\ue000-\uf8ff\U000f0000-\U000fffff\U00100000-\U0010ffff]')
Теперь мой вопрос: как мне получить демо-данные в свой код? : D – simbabque
@simbabque Pastbin для вас http://pastebin.com/LR0StPHu –