Проблема в том, что, как вы знаете, в диаграмме Unicode есть тысячи символов, и я хочу преобразовать все похожие символы в буквы английского алфавита.
Например, вот несколько преобразований:
ҥ->H
Ѷ->V
Ȳ->Y
Ǭ->O
Ƈ->C
tђє Ŧค๓เℓy --> the Family
...
и я увидел, что существует более 20 вариантов буквы А / а. и я не знаю, как их классифицировать. Они похожи на иголки в стоге сена.
Полный список символов юникода находится на http://www.ssec.wisc.edu/~tomw/java/unicode.html или http://unicode.org/charts/charindex.html . Просто попробуйте прокрутить вниз и увидеть варианты букв.
Как мне все это преобразовать с помощью Java? Пожалуйста, помогите мне :(
java
unicode
special-characters
diacritics
AhmetB - Google
источник
источник
Ответы:
Репост моего сообщения из Как удалить диакритические знаки (диакритические знаки) из строки в .NET?
Этот метод отлично работает в java (исключительно с целью удаления диакритических знаков или акцентов) .
Он в основном преобразует все акцентированные символы в их деакцентированные аналоги, за которыми следуют их комбинированные диакритические знаки. Теперь вы можете использовать регулярное выражение, чтобы убрать диакритические знаки.
источник
Это часть Apache Commons Lang с вер. 3.0.
возвращается
An
См. Также http://www.drillio.com/en/software-development/java/removing-accents-diacritics-in-any-language/
источник
Попытка «преобразовать их всех» - неправильный подход к проблеме.
Во-первых, вам нужно понимать ограничения того, что вы пытаетесь сделать. Как отмечали другие, диакритические знаки существуют по какой-то причине: они, по сути, являются уникальными буквами в алфавите этого языка со своим собственным значением / звуком и т. Д.: Удаление этих знаков аналогично замене случайных букв в английском слове. Это еще до того, как вы даже перейдете к рассмотрению кириллических языков и других текстов, основанных на алфавите, таких как арабский, которые просто невозможно «преобразовать» в английский.
Если вы должны , по какой - либо причине, преобразование символов, то единственный разумный способ приблизиться к этому , что, во - первых сократить масштабы задачи. Рассмотрим источник ввода - если вы пишете приложение для «западного мира» (чтобы использовать такую же хорошую фразу, как любая другая), маловероятно, что вам когда-либо понадобится разбирать арабские символы. Точно так же набор символов Unicode содержит сотни математических и графических символов: для пользователей нет (простого) способа напрямую ввести их, поэтому вы можете предположить, что их можно игнорировать.
Выполняя эти логические шаги, вы можете уменьшить количество возможных символов для синтаксического анализа до точки, в которой возможна операция поиска / замены на основе словаря. Тогда создание словарей превращается в небольшую скучную работу, а выполнение замены - в тривиальную задачу. Если ваш язык поддерживает собственные символы Unicode (как это делает Java) и правильно оптимизирует статические структуры, такой поиск и замена будут очень быстрыми.
Это связано с опытом работы над приложением, которое требовалось для того, чтобы конечные пользователи могли выполнять поиск в библиографических данных, содержащих диакритические символы. Для создания поисковых массивов (как это было в нашем случае) потребовалось около 1 человеко-дня, чтобы охватить все диакритические знаки для всех западноевропейских языков.
источник
Поскольку кодирование, которое превращает «Семейство» в «tђє Ŧ ค ๓ เ ℓy», является фактически случайным и не следует никакому алгоритму, который можно объяснить информацией задействованных кодовых точек Unicode, нет общего способа решить эту проблему алгоритмически.
Вам нужно будет построить отображение символов Unicode в латинские символы, которые они похожи. Вероятно, вы могли бы сделать это с помощью интеллектуального машинного обучения на реальных глифах, представляющих кодовые точки Unicode. Но я думаю, что для этого потребуется больше усилий, чем при построении карты вручную. Особенно, если у вас есть большое количество примеров, на основе которых вы можете построить свое отображение.
Чтобы уточнить: некоторые из замен фактически могут быть решены с помощью данных Unicode (как показывают другие ответы), но некоторые буквы просто не имеют разумной связи с латинскими символами, на которые они похожи.
Примеры:
источник
На исходный запрос уже был дан ответ.
Однако я публикую ответ ниже для тех, кто может искать общий код транслитерации для транслитерации любой кодировки на латынь / английский язык в Java.
Наивный смысл перевода: переведенная строка в ее окончательной форме / целевой кодировке звучит как строка в исходной форме. Если мы хотим транслитерировать любую кодировку в латиницу (английский алфавит), то ICU4 (библиотека ICU4J в java) выполнит эту работу.
Вот фрагмент кода на java:
источник
Проверенная строка: ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝß
Проверено:
Последний вариант - лучший.
источник
Если необходимо преобразовать «òéışöç-> oeisoc», вы можете использовать это в качестве отправной точки:
JDK 1.6 предоставляет класс java.text.Normalizer, который можно использовать для этой задачи.
См. Пример здесь
источник
Вы можете попробовать использовать
unidecode
, который доступен как ruby gem и как модуль perl на cpan . По сути, он работает как огромная таблица поиска, где каждая кодовая точка Unicode связана с символом или строкой ascii.источник
Нет простого или общего способа сделать то, что вы хотите, потому что это всего лишь ваше субъективное мнение, что эти буквы выглядят так, как латинские буквы, в которые вы хотите преобразовать. На самом деле это отдельные буквы со своими собственными именами и звуками, которые внешне выглядят как латинские буквы.
Если вы хотите этого преобразования, вы должны создать свою собственную таблицу перевода на основе того, в какие латинские буквы, по вашему мнению, следует преобразовывать нелатинские буквы.
(Если вы хотите удалить только диакритические знаки, в этой теме есть несколько ответов: Как удалить диакритические знаки (акценты) из строки в .NET? Однако вы описываете более общую проблему)
источник
Я опаздываю на вечеринку, но, столкнувшись с этой проблемой сегодня, я нашел этот ответ очень хорошим:
Ссылка: https://stackoverflow.com/a/16283863
источник
Проблема с «преобразованием» произвольного Unicode в ASCII заключается в том, что значение символа зависит от языка и региональных параметров. Например, «ß» для немецкоязычного человека следует преобразовать в «ss», в то время как англоговорящий, вероятно, преобразовал бы его в «B».
Добавьте к этому тот факт, что Unicode имеет несколько кодовых точек для одних и тех же глифов.
В результате единственный способ сделать это - создать массивную таблицу с каждым символом Unicode и символом ASCII, в который вы хотите его преобразовать. Вы можете использовать ярлык, нормализовав символы с диакритическими знаками до нормализации формы KD, но не все символы нормализуются до ASCII. Кроме того, Unicode не определяет, какие части глифа являются «акцентами».
Вот небольшой отрывок из приложения, которое делает это:
источник
Следующий класс делает свое дело:
источник