Как я могу отобразить символы Юникода в более простой латинский скрипт, эквивалентный в Java
Я хочу отобразить графические / символьные символы в более простой альтернативе Java, где это возможно, например:
- U1E36 латинская заглавная буква l с точкой ниже -> L
- U25B6 Черный Правильный Треугольник ->>
- U25C0 Черный треугольник влево -> <
- U25B2 Черный треугольник, направленный вверх -> ^
Моя проблема в том, что я не знаю, что такое все символы, поэтому, хотя технически достаточно просто отобразить конкретные символы выше, это трудно сделать для каждого, их может быть сотни.
У меня уже есть этот код для удаления акцентов ecetera
public static final Pattern DIACRITICS_AND_FRIENDS
= Pattern.compile("[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+");
private static String stripDiacritics(String str) {
str = Normalizer.normalize(str, Normalizer.Form.NFD);
str = DIACRITICS_AND_FRIENDS.matcher(str).replaceAll("");
return str;
}
Поэтому мне было интересно, было ли что-то похожее, чтобы помочь мне с этими символами символов, заметьте, я не хочу когда-либо удалять их, просто заменить на более простое представление.
2 ответа
Я нашел этот фильтр Lucene, который пытается сделать то, что я пытаюсь сделать, просматривая каждый символ со значением Юникода больше \u0080 и проверяя, имеет ли он отображение на более простой символ с помощью массивного оператора case
и изменить версию можно найти, загрузив исходный код и глядя в
org.apache.lucene.analysis.miscellaneous
пакет
Таким образом, разумная попытка уже была предпринята, но довольно трудно определить, какие дополнительные символы она охватывает, которые не охватываются методом нормализатора.
То, что вы хотите сделать, не может быть сделано в общем виде, потому что стандарт Юникода не всегда определяет "более простые" формы каждого символа, и во многих случаях даже не имеет смысла пробовать.
Если вы посмотрите на страницу типа LATIN SMALL LETTER U WITH DIAERESIS, вы увидите, какую информацию стандарт фактически указывает для данного символа. (Посмотрите только на блок с меткой Unicode Data.)
Обратите внимание, что существует Декомпозиция, заданная в другой последовательности Юникода, однако символ может быть представлен как \u00fc
, или же \u0075\u0308
, Вы можете механически преобразовать экземпляры первого во второй, а затем убрать все метки объединения, однако...
Теперь посмотрите на что-то вроде CYRILLIC SMALL LETTER DZE, и вы увидите, что пока оно печатается с использованием чего-то более или менее похожего S
На самом деле это совершенно другое письмо. На самом деле звук, который он издает, - / dz /.
Если вы действительно хотите это сделать, вам придется буквально написать библиотеку с базой данных, содержащей сопоставление для каждого отдельного символа. Некоторые, как в первом примере выше, вы можете сделать полуавтоматически, но другие, как во втором примере, не имеют реального четкого отображения.