Я пытаюсь удалить диакритические знаки из панграммы на польском языке. Я использую код из блога Майкла Каплана http://www.siao2.com/2007/05/14/2629747.aspx , однако безуспешно.
Рассмотрим следующую панграму: «Pchnąć w tę łódź jeża lub ośm skrzyń fig. ". Все отлично работает, но на букву "ł" я все равно получаю "ł". Я предполагаю, что проблема в том, что «ł» представлен в виде единого символа Юникода, и не существует следующего NonSpacingMark.
У вас есть идея, как я могу это исправить (не полагаясь на пользовательское отображение в каком-то словаре - я ищу какое-то преобразование в юникоде)?
Подход, использованный в статье, заключается в удалении меток, не пробелов. Поскольку, как вы правильно заметили, "ł" не состоит из двух символов (один из которых - Mark, Nonspacing), поведение, которое вы видите, ожидаемо.
Я не думаю, что структура Unicode позволяет выполнить полностью автоматическое переназначение (автор статьи, на которую вы ссылаетесь, приходит к такому же выводу).
Если вас интересуют только польские иероглифы, по крайней мере, отображение небольшое и четко определенное (см., например, нижнюю часть http://www.biega.com/special-char.html ). В общем случае, я не думаю, что существует автоматизированное решение для символов, которые не состоят из стандартного символа и знака без пробела.
Он находится в диаграмме Unicode , кодовая точка \ u0142. Прокрутите вниз до описания "Строчная латинская буква со штрихом", в нем нет декомпозиции. Ничего не знаю о польском языке, но обычно у буквы есть отличительный знак, который делает ее собственной буквой, а не базовой с диакритическим знаком.
Существует довольно много предварительно составленных символов, которые не имеют осмысленных разложений.
(Есть также несколько, которые могут иметь разумные декомпозиции, которые запрещены для такой декомпозиции в большинстве форм нормализации, поскольку это привело бы к различиям между версиями, что сделало бы их на самом деле уже не нормализацией).
ł является одним из них. IIRC также невозможно дать нейтральную в культурном отношении транскрипцию для алфавитов, в которых не используется ł. Я думаю, что немцы склонны транскрибировать это как w, а не l (или, может быть, это делает кто-то другой), что имеет смысл (это тоже не совсем правильный звук, но он ближе, чем l).
Вам придется заменить их вручную (так же, как ÆÐØÞßæðøþ в Latin-1).
У других людей была такая же проблема, поэтому репозиторий данных Unicode Common Locale Data «Согласился добавить транслитератор, который удаляет акценты, даже для наложенных акцентов». (Билет №2884)