Как правильно нормализовать строку с составными символами?

Java Normalize уже позволяет мне брать акцентированные символы и выводить не акцентированные символы. Однако он, похоже, не очень хорошо справляется с составными символами (Œ, Æ).

Есть ли способ для Java иметь дело с этими персонажами изначально? Я хотел бы предотвратить сохранение карты этих символов (поскольку по этой причине мы в первую очередь перешли на использование нормализации).

Например, ввод "Œ" должен возвращать "OE", почти так же, как он уже аккуратно разлагает такие символы, как "½" на "1/2".

1 ответ

Решение

TLDR; Нет, с нативной Java нет способа справиться с этим единообразно.

Длинный ответ

Как отмечено в этом вопросе, разделяя лигатурные символы Unicode, реализация Java Normalizer не поддерживает все лигатуры, существующие на письменном языке.

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

Точка зрения данных утверждает, что информация не теряется, и поэтому имеет больше смысла использовать только разложенные формы и что составные формы не должны быть в Unicode.

Точка зрения Layout утверждает, что составленная лигатура представляет собой правильное расположение письменной формы языка и поэтому должна быть представлена ​​в данных специальным кодом.

Возможное решение

Я бы предложил создать Сервис, который имеет интерфейс, который обрабатывает только лигатуры. Предоставьте конкретную реализацию, которая обрабатывает все, что вам нужно в данный момент. В будущем, если понадобятся новые реализации, будет просто добавить их без изменения исходного кода, просто добавив новый JAR-файл в путь к классам программы, который добавляет недостающие лигатуры.

Скелетная реализация может выглядеть следующим образом.

Обратите внимание, что я пропустил код, который на самом деле использует ServiceLoader найти LigatureDecoder а также LigatureEncoder Реализации.

final class Ligatures {
  public static CharSequence compose ( CharSequence decomposedCharacters );
  public static CharSequence decompose ( CharSequence composedCharacters );
}

interface LigatureDecoder {
  CharSequence decompose ( CharSequence composedCharacters );
}

interface LigatureEncoder {
  CharSequence compose ( CharSequence decomposedCharacters );
}
Другие вопросы по тегам