Существует не менее 1,114,111 допустимых кодовых точек Unicode. Моя стандартная для США клавиатура делает доступными те, которые находятся в диапазоне от 1 до 127 (основание 10).
Когда вы выходите за пределы этого диапазона, вы начинаете попадать либо в языковые стандарты старого стиля, либо в более современные кодовые точки UTF8 (или другого Unicode). Многие из этих кодовых точек легко доступны с клавиатуры где-нибудь в мире. Но, не выходя из дома или офиса, вы обнаружите, что небольшая часть из этих 1,1 миллиона легко доступна с клавиатуры.
Существует свойство Unicode под названием QMark
(короткое имя) или Quotation_Mark
(длинное имя), которое включает 29 кодовых точек стиля кавычек (в UTF8, шестнадцатеричный): 0x0022, 0x0027, 0x00ab, 0x00bb, 0x2018, 0x2019, 0x201a, 0x201b , 0x201c, 0x201d, 0x201e, 0x201f, 0x2039, 0x203a, 0x300c, 0x300d, 0x300e, 0x300f, 0x301d, 0x301e, 0x301f, 0xfe41, 0xfe42, 0xfe43, 0xfe2ff, 0xfe2ff, 0xfe2ff
Вот как они выглядят (при условии, что ваши шрифты поддерживают их все):
"'«»‘’‚‛“”„‟‹›「」『』〝〞〟﹁﹂﹃﹄"'「」
Есть свойство Unicode ASCII
, которое, что неудивительно, содержит 128 кодовых точек от 0 до 127.
Кажется, я не могу найти свойство Unicode, которое определяет «Все, что не является ASCII», но вы узнаете это благодаря тому факту, что оно выходит за пределы диапазона 0 .. 127.
Существует также свойство Unicode Hyphen
, которое содержит одиннадцать кодовых точек: 0x002d, 0x00ad, 0x058a, 0x1806, 0x2010, 0x2011, 0x2e17, 0x30fb, 0xfe63, 0xff0d и 0xff65. Я не хочу вставлять их все сюда, так как по крайней мере два из них не отображаются в моем терминале. Но вот идет:
-֊᠆‐‑⸗・﹣-・
Как видите, одни неотличимы от других. Когда я использую свойство Hyphen
в Perl 5.16, я получаю предупреждение о том, что конкретное свойство Unicode устарело. Я не знаю, только ли это для Perl или для Unicode в целом.
Также существует свойство Dash
, содержащее 27 кодовых точек. Думаю, вы поняли, поэтому я не буду их здесь перечислять. ... и еще один по имени Dash_Punctuation
с 23 кодовыми точками. Обратите внимание, что многие кодовые точки могут быть отнесены к более чем одному свойству Unicode, поэтому возможно, что есть совпадение между Hyphen
и Dash
, и, вероятно, даже большее совпадение между Dash
и Dash_Punctuation
- я не знаю и не проверял.
Я знаю, что это никоим образом не касается Perl, но я обнаружил, что Perl имеет довольно хорошую документацию по свойствам Unicode здесь: perldoc perluniprops.
Итак, я предполагаю краткий ответ на вопрос: «Есть ли еще?» есть да, еще около 1,1 миллиона.
Обновление: Относительно того, как называются эти надоедливые символы ... Вы вроде как должны различать кодовые точки и глифы. Кодовая точка - это недвусмысленное представление сущности Unicode, тогда как глиф - это то, на что она похожа. Различные шрифты могут реализовывать данный глиф по-разному. То, что выглядит одинаково в одном шрифте, может выглядеть немного иначе в другом. Начните думать, что кодовые точки Unicode и связанные с ними полные имена имеют семантическое значение, тогда как глифы являются простыми графическими (ненадежными) представлениями.
Обновление 2: в некоторых языках программирования (в частности, Perl, но, возможно, и в других) вы можете создавать собственные классы символов, используя логику set. В Perl они называются расширенными классами символов в квадратных скобках. , и обсуждаются в perldoc perlrecharclass
. Если вы хотите сопоставить все кавычки, не входящие в диапазон ASCII, вы можете использовать это подвыражение:
(?[\p{QMark}-\p{ASCII}])
Вышеупомянутое подвыражение создает класс символов, который соответствует всем подобным кавычкам знакам, за исключением тех, которые происходят из диапазона ASCII. Это функция, которая появилась в Perl в версии Perl 5.18. Учитывая, что это «Обновление 2» было добавлено в 2019 году, а Perl 5.18 был выпущен в 2013 году, функция была доступна примерно четыре года. К сожалению, я не нахожу никаких указаний на то, что он нашел свое место в библиотеках PCRE за пределами Perl.
Хотя она существует уже четыре года, эта функция (начиная с Perl 5.28) все еще помечена как «экспериментальная». Следовательно, чтобы использовать его, вы должны добавить следующую прагму в область, в которой он используется:
no warnings qw(experimental::regex_sets);
Это подавит экспериментальное предупреждение. Я не удивлюсь, если это предупреждение будет снято в ближайшем будущем Perl.
person
DavidO
schedule
08.07.2012