Как я могу сопоставить символы Unicode с более простым эквивалентом латинского сценария в Java

Я хочу сопоставить графические/символические символы с более простой альтернативой Java, где это возможно, например:

  • U1E36 латинская заглавная буква l с точкой внизу -> L
  • U25B6 Черный треугольник, указывающий вправо -> >
  • U25C0 Черный треугольник, указывающий влево -> ‹
  • U25B2 Черный треугольник, указывающий вверх -> ^

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

У меня уже есть этот код для удаления акцентов и так далее.

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;
}

Поэтому мне было интересно, есть ли что-то подобное, чтобы помочь мне с этими символами символов, обратите внимание, что я не хочу когда-либо удалять их, просто замените их более простым представлением.


person Paul Taylor    schedule 28.09.2014    source источник
comment
За комментарий в другом месте. Суть в том, чтобы предоставить представление значения, которое можно использовать в имени файла, чтобы оно было более переносимым - посмотрите на URLEncoder.   -  person Jongware    schedule 28.09.2014
comment
Спасибо, но это не то, что я имею в виду   -  person Paul Taylor    schedule 29.09.2014


Ответы (2)


То, что вы хотите сделать, не может быть сделано в общем виде, потому что стандарт Unicode не всегда определяет «более простые» формы каждого символа, и во многих случаях даже не имеет смысла пытаться.

Если вы посмотрите на страницу типа СТРОЧНАЯ ЛАТИНСКАЯ БУКВА U С ДИЕРЕЗИСОМ вы увидите, какую информацию стандарт фактически указывает для данного символа. (Смотрите только на блок с пометкой Данные Unicode.)

Обратите внимание, что есть декомпозиция, заданная в другой последовательности Юникода, однако символ может быть представлен либо как \u00fc, либо \u0075\u0308. Однако вы можете механически преобразовать экземпляры первого во второй, а затем удалить все объединяющие метки...

Теперь посмотрите на что-то вроде СТРОЧНАЯ БУКВА ДЗЕ, и вы обратите внимание, что хотя оно напечатано с использованием чего-то более или менее похожего на S, на самом деле это совершенно другая буква. На самом деле он издает звук /dz/.

Если бы вы действительно действительно хотели это сделать, вам пришлось бы буквально написать библиотеку с базой данных, содержащую сопоставление для каждого отдельного символа. Некоторые, как в первом примере выше, вы могли бы сделать полуавтоматически, но другие, такие как второй пример, не имеют четкого сопоставления.

person caskey    schedule 28.09.2014
comment
Спасибо, но вопрос касается символов и графических символов, а не диакритических знаков и тому подобного, эта часть уже решена достаточно хорошо для моих целей. Суть в том, чтобы предоставить представление значения, которое можно использовать в имени файла, чтобы оно было более переносимым. Обычно эта функция будет использоваться пользователями, которые не могут произносить или понимать исходный язык, а также в графических символах, которые в любом случае не имеют значения. - person Paul Taylor; 28.09.2014
comment
@PaulTaylor: но основная система та же. Не существует «общего» преобразования, о котором вы спрашиваете, поэтому вам необходимо создать таблицу преобразования самостоятельно. Каски правильно указал на это в своем последнем абзаце. - person Jongware; 28.09.2014
comment
Я удивлен, что либо я первый, кто этого хочет, либо я не первый, но никто не хочет делиться своим пользовательским преобразованием. - person Paul Taylor; 28.09.2014
comment
Добро пожаловать в мир I18N. :-) Также обратите особое внимание на пример с кириллицей, там сходство глифов не имеет отношения к лежащему в основе согласному звуку. К сожалению, глифы — это глифы, символы — это символы, а Unicode кодирует только символы. Шрифты кодируют глифы. - person caskey; 30.09.2014