Как стать автором
Обновить

Комментарии 66

Сказав как неправильно, надо сказать и как правильно.
Желательно сразу с рецептами на разных языках (программирования).
Я сказал. Для titlecase не использовать uppercase, а взять соответсвующее поле Unicode. Например, здесь (titlecase — последняя колонка). Для сравнения не использовать не uppercase, не lowercase, а использовать CaseFolding. Не закладываться на длину строки после изменения регистра. А разные языки программирования — отдельная тема, всё сразу не влазит :-)
НЛО прилетело и опубликовало эту надпись здесь
Нормализация — это немного другое (например, разбор скомбинированного символа на компоненты или разбор лигатур). Она не для регистронезависимого сравнения, а для сравнения строк «по существу». В нормализованном виде заглавные и строчные буквы всё же отличаются.
Моя любимая ссылка про Unicode (чтобы прочитать её как можно более полно я специально ставил шрифты):

stackoverflow.com/questions/6162484/why-does-modern-perl-avoid-utf-8-by-default

Там очень много интересного, включая цитату «Code that assumes that ASCII is good enough for writing English properly is stupid, shortsighted, illiterate, broken, evil, and wrong. Off with their heads! If that seems too extreme, we can compromise: henceforth they may type only with their big toe from one foot (the rest still be ducktaped)».

Парсер выкусил немного нетрадиционного юникода из коммента выше… На хабре тоже не любят unicode?

¡ƨdləɥ ƨᴉɥʇ ədoɥ puɐ ʻλɐp əɔᴉu ɐ əʌɐɥ ʻʞɔnl poo⅁
Лучше бы с утечками памяти боролись)
И не говорите, мерзкое население досталось планете Земля, навыдумывали тут всякого!
Такова жизнь. Язык усложняется сам по себе — хотя бы из-за подражаний не то немцам, не то французам (например, «кронштейн» с его [э]). А вот в «шинели» или «Одессе» этого [э] никогда не было.

Впрочем, язык умеет и упрощаться. Но усложнения, видимо, перевешивают. Приходится упрощать «по указке» (от упрощений страдают в первую очередь образованные люди). И последнее крупное изменение русской письменности произошло в удачнейший момент: наиболее реакционная часть народа смылась в Парижи, а ликбез дал стране новых грамотных.

Приведу аналогию. Многие из нас программисты. Все мы ругаемся на плохой код, и любая действующая программа размером в несколько десятков тысяч строк будет смесью хорошего и плохого кода. Почему плохой не переписываем? А потому что в программе бывает сложная логика, которую написать и проверить тяжело, и, возможно, это время лучше потратить на другие фичи.

Есть одно показательное упрощение, связанное с компами. Украина, 1994 год, надднепрянские диалекты в немилости. И вдруг объявляют: последовательность букв в украинском алфавите теперь как в русском, для упрощения компьютерной обработки.
(Для тех, кто не знает: литературный украинский основан на надднепрянском диалекте. А примерно в это время начали появляться персонажи изх канадской диаспоры и заменять «аеропорт» на «летовище», хотя второе слово больше ассоциируется с травяным полем и «колбасой» на столбе, чем с той махиной, которой стал современный аэропорт.)
…А потому что в программе бывает сложная логика, которую написать и проверить тяжело, и, возможно, это время лучше потратить на другие фичи. Точно так же и в языке переходные процессы (если изменение крупное) продлятся очень долго, а в краткосрочной перспективе — только негатив.
…точно так же «плохим кодом» будет «блоггер». Но это слово пока на правах неологизма, так что бери и исправляй, пока горячо. Правило таково: если суффикс «ер» можно оторвать, одна буква (есть «блог», поэтому в словари вошло «блогер»). Если оторвать нельзя, две буквы («роллер» есть, а «рола» нет). А «стример» с одной буквой потому, что и в английском одна буква.
Век живи, век учись. Автор, огромное спасибо!
Вывод: никогда не пишите свой собственный текстовый редактор, пусть мучаются программисты Майкрософт:)
Titlecase не во всех языках — прямолинейное «первая буква заглавная, остальные строчные»: как минимум, в голландском диграф IJ (два символа, не лигатура) набирается всегда в одном регистре, и название Исландии пишется IJsland.

Подробнее: ru.wikipedia.org/wiki/IJ
Зато если использовать лигатуру (U+0133) и пользоваться полем titlecase, то всё нормально:
0133;LATIN SMALL LIGATURE IJ;Ll;0;L; 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132
Для этого диграфа uppercase и titlecase совпадают (в отличие от dz), поэтому IJsland вполне получится.
И останется только заставить пользователей набирать IJ спецсимволом, отсутствующим на клавиатуре, а не двумя отдельными символами, к которым все давно привыкли.
Неудобно, факт.
Ещё замечу о немеханических, языкозависимых правилах капитализации: бывает, что служебные слова в начале предложения при переводе в titlecase игнорируются, как например в том же голландском (пример взят из Википедии): 's Avonds is zij nooit thuis. — cочетание 's avonds «вечером» в начале предложения записывается как 's Avonds.
Справедливости ради, как минимум поляки не пользуются диграфами для записи любых символов, в том числе и dz. Собственно, как в английском языке не употребляют отдельный знак для диграфа «ch» (даже не уверен, есть ли он в юникод). Правильнее сказать, что символ "dz" может встречаться в фонетическом алфавите, но там речи о uppercase/titlecase как раз никогда не идёт. Сомневаюсь, что в других перечисленных языках, кроме македонского (потому что у македонцев кириллица, и им один символ был бы удобнее) ситуация иная.
Да, я понимаю, что лигатурами и диграфами мало кто пользуется, просто так набирая текст. Но они вполне могут встретиться в текстах онлайн-библиотек. Некоторые сайты могут принципиально заменять все dz на лигатуру из соображений визуальной красоты. Если вы, к примеру, занимаетесь индексацией контента такого сайта или библиотеки, вам об этом надо помнить. Конечно, всё это очень частные случаи, но с ними можно реально столкнуться.
Так-то оно могло бы быть и так, но статья про диграф dz в польской википедии (а википедисты — самые ярые поборники «правильных» юникодных символов, по-моему) употребляет сам диграф только как раз в фонетическом обозначении)
НЛО прилетело и опубликовало эту надпись здесь
Я понимаю. Я просто хотел сказать, что если бы этот диграф имел хоть какое-нибудь употребление, уж в википедии, да ещё и в статье про него самого он был бы использован.
Та же проблема с украинским языком, причем в Юникоде существует несколько символов апострофа: U+02BC и U+2019, первый используется в доменах типа мʼякий.com.ua а второй — в типографских раскладках (у него проблемы с отображением и проверкой правописания).
… у первого символа проблемы …
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
PHP в данном случае как раз и есть «разнообразный софт».

А какая у вас местная локаль?
НЛО прилетело и опубликовало эту надпись здесь
У венгров, например, букв, основанных на одной только графеме «O», целых 4: без диакритики, с одинарным ауктом, с двойным акутом, с умлаутом. Каково вот им? :-)

Здесь пример предложения на венгерском, в котором представлено 3 таких из 4. Над тем примером есть ещё десятка три рукописных образцов письменности из разных стран мира (одни из самых причудливых по форме — из Бангладеш).

У Китая, Кореи, Эфиопии, в арабских странах, в индийской/бенгальской/мьянмарской/тайской/кхмерской письменности и т.п., в иврите и ещё ряде других письменностей не различаются строчные и заглавные символы, зато огромное количество своих нюансов и особенностей.

Так что латиница и кириллица — это ещё не самый капец :)
> в ряде других письменностей не различаются строчные и заглавные символы
Собственно, у двух третей населения планеты в письменности нет заглавных и строчных букв.
Так что поднятая в топике проблема — чисто наша местечковая :)
Полноширинные и полуширинные символы катаканы тоже не очень способствую упрощению. Да и честно, даже не знаю как в CJK решаются проблемы такого вида:

vs
亻乃
Одно и то же это или нет?
Полноширинные и полуширинные символы (не только каны) мэпятся друг на друга через поле декомпозиции. К примеру:
FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L;<narrow> 30A2;;;;N;;;;;
FF71 (ア) — узкий вариант символа 30A2 (ア).

Декомпозиция иероглифов вряд ли входит в спектр задач Unicode.
Как японцы, так и китайцы считают это совершенно разными вещами (не считая литспика, но он не слишком распространён: набирать так длинный текст — ад). Разницу иногда обыгрывают, например 糸色望 vs 絶望.

Приведение к общему знаменателю традиционных, упрощённых, японских и местных иероглифов, тем более написанных не совсем правильно — другое дело.
Спасибо. Будем знать :)
Статьи из этой серии стоит переименовать в «почему стоит использовать стандартные функции самых проверенных и авторитетных (а если есть, то лучше — стандартных) библиотек и не выпендриваться».
Дело не только в этом. Вон используют выше по тексту стандартную и проверенную функцию для lowercase в PHP, а она у турков переводит quit в QUİT, чего вы никак ожидать и протестировать не могли, если не знали об этой особенности заранее. Как раз посыл был в том, что иногда «использовать стандартное и не греть голову» не получается. Голову всё равно приходится греть.
(… не начинать холивар про PHP…… не начинать холивар про PHP...)

По мне, так такие ситуации просто говорят о том, что стандартные библиотеки не справляются со своими непосредственными задачами, и выход — просто найти лучшую замену.
Я на PHP не пишу, но практически уверен, что этой функции можно указать локаль. Если просто задать в нужных местах не системную, а конкретную (English-US, там), то всё будет работать так, как вы ожидаете. Вопрос не в том, правильно ли работают библиотеки, а в том, правильно ли вы понимаете, как они работают. А для PHP это как раз плюс, что они интернационализацию поддерживают.
Ну тогда действительно, в мой коммент надо дописать «использовать библиотеки ПРАВИЛЬНО и ЧИТАТЬ ДОКУМЕНТАЦИЮ» ;)
Если бы все использовали библиотеки правильно и читали документацию… Насколько лучше был бы ПО. Но, не так всё радужно, вот совсем недавно возникала проблема с MySQL, где недочитали о том, что возвращает memcmp.
Такие статьи просто обращают внимание тех разработчиков, которые ещё не вникли в проблему.
В функции нельзя, но прямо определять локаль для которой написан код в настроечном файле фреймворка/CMS — это в PHP просто необходимо.
Ну то есть мой пример с uppercase, а с lowercase наоборот — QUIT превращается в quıt.
Спасибо огромное! Интереснейшая статья.
Вы сломали мне мозг и привели в ужас
Unicode hell!
Нет, это не нормально, с эти надо что-то делать. Unicode перестал быть удобным инструментом представления символов и превратился в адскую мешанину правил и исключений, напичканную ненужным хламом (вроде символов-картинок «на все случаи жизни»).
Юникод должен сопровождаться библиотеками для выполнения всех этих преобразований. Как неотъемлемой частью стандарта.
А какая может быть альтернатива?
Стопицод несовместимых кодировок?

Но Юникод адъ и мракъ потому, что адъ и мракъ языки. А поскольку Юникод покрывает важнейшие живые языки мира, весь этот ад приходится переносить и в Юникод.

О картинках. Есть куча технических символов, которые гарантированно должны быть в Юникоде — например, «забой символа» (пятиугольник с крестом), «непараллельность» (острый угол с дугой угла) или «естественная шероховатость» (галочка с кружочком). Японцы в SMS общаются так называемыми «эмодзи» — картиночками, которые кодировались у ОпСоСов какими-то спецкодами. И пошло-поехало, даже не поймёшь сразу, где тут остановиться. Хорошо, что комитет Юникода непоколебим: товарных знаков в таблице быть не должно.
Сначала нас временем напугали, теперь юникодом. Как жить, как жить…
Кстати, вот эсцет в нижнем — ß — и верхнем — ẞ — регистре :-) STRAẞE.
Как-то оно чужеродно выглядит.
Ещё, говорят, в текстах на литовском может встретиться заглавная Ì (U+00CC), которая превратится не в ì (U+00EC), а в (U+0069, U+0307, U+0300).
Я считаю литовский родным языком. Абсолютно не понимаю о чём речь в вышестоящем предложении.
Да, мне это тоже показалось странным. Пройдите по ссылке, там со слова Lithuanian почитайте. Может, я неправильно понял. Если что-то не так, я исправлю.
А, так это о знаке ударения. Я думал, что это об акцентах, являющихся смысловой частью (в литовском, например, e, ė и ę – три разных буквы).

Тогда это предложение лишь о том, что в литовском языке, в противовес западной традиции, знак ударения ` не совмещается с точкой над i. И вместо западного
i + ` = ì,
в литовском
i + ` = ì̇
(обратите внимание, как, скорее всего, неправильно в вашем браузере рендерится последний символ).
Спасибо за разъяснение, я немного поправил пост. Так лучше? Если начертание выглядит всё ещё неправильно, сделайте картинку с буквой и киньте на habrastorage, я вставлю.
Простите за задержку с ответом, но Хабр мне иногде не шлёт по почте ответы.
Не понимаю, почему.


Я не комитет по литовскому языку, но я однозначно считаю, что знак ударения должен быть над точкой, а не под ней (пример).

Тем не менее, я не думаю, что это имеет ценность для статьи. :)
Вебкит обрабатывает правильно.

Мрачно подозреваю, что зависит не только от браузера, но и от комплекта шрифтов, установленных в операционной системе.
Чуть выше я ответил, что, мне кажется, это неправильно.
Хм, получается, что это не ошибка рендера, а проблема самого юникода, в нём никак не указан приоритет что над чем.
В Опере нормально:
Чуть выше я ответил, что, мне кажется, это неправильно.
Какой же хороший, годный русский язый.

Хотя у нас есть Ё, которая хоть и преобразуется однозначно, но может доставлять при сравнении слов, ибо человеческий фактор допускает её игнорирование. А простое приведение к е при сравнении может оказаться фэйлом. Кстати, у нас ещё есть неоднозначные американизмы и албанизмы.
Напомнило статью вро возможные ошибки связанные с функциями времени, по стилю написания.Там был указан оригинальный автор идеи такого изложения.Может, и тут стоит...?
Если конечно это не случайное совпадение)

Сама по себе интересная статья.Если не читать такого — баги потом ловить и ловить…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации