Есть ли категория или имя для таких символов, как умные кавычки и тире, которая всегда ломается?

Многие, вероятно, сталкивались с копированием текста из Word в форму веб-сайта или что-то в этом роде, и все кавычки ('), двойные кавычки (") и тире (-) искажались. Я считаю, что кавычки называются" умными кавычками "или" Цитаты типографа ", но я не знаю названия тире. Есть ли категория, в которую входят эти символы? Есть еще?

Отличительные особенности этой категории: Доступно с обычной qwerty-клавиатурой и легко визуально ошибочно принять за эквивалент ASCII.

Этот вопрос, похоже, связан с той же проблемой: Как преобразовать умные кавычки Word и длинное тире в строку? Также, возможно, они называются" em тире "?


person Mikey    schedule 08.07.2012    source источник
comment
Вы спрашиваете, какое свойство Unicode будет описывать все символы, доступные с обычной клавиатуры и визуально ошибочно принимаемые за эквивалент ASCII? Я думаю, что это привело бы к субъективным ответам, поскольку клавиатуры во всем мире различаются. Я думаю, что на моем, вероятно, нет никаких ключей, отличных от ASCII. Или вы спрашиваете конкретно о том, какое свойство Unicode будет определять символы типа цитат?   -  person DavidO    schedule 08.07.2012
comment
Более того, если среди разработчиков есть термин для этих пиковых символов, я должен поискать в Google, чтобы найти решение, которое уже реализовало этот фильтр.   -  person Mikey    schedule 08.07.2012
comment
Символы, доступные с обычной qwerty-клавиатуры, будут зависеть от того, какое приложение вы используете. В MS Word, когда я набираю двойные кавычки, они преобразуются в ЛЕВУЮ ДВОЙНУЮ ЦИТАТУ (U + 201C) и ПРАВУЮ ДВОЙНУЮ ЦИТАТУЮ МАРКУ (U + 201D). Когда я набираю то же самое здесь в своем веб-браузере, это просто ЦИАТОВЫЕ ЗНАКИ (U + 0022).   -  person Keith Thompson    schedule 08.07.2012
comment
возможно, моя категория в словах отличается от блокнота, я думаю, это может быть довольно близко к тому, что я имею в виду.   -  person Mikey    schedule 09.07.2012


Ответы (1)


Существует не менее 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