Разделение лигатурных символов Unicode

В огромном количестве символов Юникода есть такие, которые на самом деле представляют более одного символа, например лигатура U+FB00 two для двух символов "f". Есть ли способ легко преобразовать подобные символы в несколько отдельных символов? Желательно, чтобы что-то было доступно в стандартном Java API, но я могу ссылаться на внешнюю библиотеку, если это будет необходимо.

3 ответа

Решение

U+FB00 - символ совместимости. Обычно Unicode не поддерживает отдельные кодовые точки для лигатур (утверждая, что это решение макета, если и когда лигатура должна использоваться, и не должна влиять на то, как хранятся данные). Некоторые из них все еще существуют, чтобы обеспечить совместимость преобразования в обоих направлениях со старыми кодировками, которые представляют лигатуры как отдельные объекты.

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

В Java вам нужно использовать Normalizer класс и NFKC форма:

String ff ="\uFB00";
String normalized = Normalizer.normalize(ff, Form.NFKC);
System.out.println(ff + " = " + normalized);

Это напечатает

 ff = фф 

Процесс, о котором вы говорите, называется нормализацией и указан в технической заметке Unicode Forms Forms.

В библиотеке классов Java SE есть класс java.text.Normalizer который реализует этот процесс. Однако вам нужно прочитать документ Unicode, связанный выше, чтобы выяснить, какую из "форм нормализации" вам нужно использовать, чтобы получить желаемый результат. Это не просто....

Вы можете попробовать java.text.Normalizer, но я не совсем уверен, работает ли это для лигатур.

Другие вопросы по тегам