Нормализация / неакцентирование текста в Java - PullRequest
4 голосов
/ 08 ноября 2011

Как я могу нормализовать / не акцентировать текст в Java?В настоящее время я использую java.text.Normalizer:

Normalizer.normalize(str, Normalizer.Form.NFD)
    .replaceAll("\\p{InCombiningDiacriticalMarks}+", "")

Но это далеко не идеально.Например, он оставляет норвежские символы æ и ø нетронутыми.Кто-нибудь знает альтернативу?Я ищу что-то, что конвертировало бы символы на всех языках в диапазон az.Я понимаю, что есть разные способы сделать это (например, должен ли æ быть закодирован как «a», «e» или даже «ae»?), И я открыт для любого решения.Я предпочитаю не писать что-то сам, так как думаю, что вряд ли я смогу сделать это хорошо для всех языков.Производительность НЕ критична.

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

РЕДАКТИРОВАТЬ:

Хорошолюди, спасибо за пренебрежение постом и не решение моего вопроса, уууу!:) Может быть, я должен был пропустить вариант использования.Но, пожалуйста, позвольте мне уточнить.Мне нужно преобразовать имя, чтобы хранить его внутри. Я не могу контролировать выбор разрешенных здесь букв. Имя будет отображаться пользователю, например, в URL.Точно так же, как ваше имя пользователя на этом форуме нормализуется и отображается вам в URL, если вы нажмете на свое имя.Этот форум преобразует имя типа "Bășan" в "baan", а имя типа "Øyvind" - в "yvind".Я верю, что это можно сделать лучше.Я ищу идеи и, желательно, библиотечную функцию, чтобы сделать это для меня.Я знаю, что не могу понять это правильно, я знаю, что «o» и «ø» различны и т. Д., Но если меня зовут «Øyvind» и я регистрируюсь на онлайн-форуме, я бы предпочел, чтобы мое имя пользователя былоОйвинд ", а не" Увинд ".Надеюсь, что это имеет какой-то смысл!Спасибо!

(И НЕТ, мы не позволим пользователю выбирать свое имя пользователя. Я просто ищу альтернативу java.text.Normalizer. Спасибо!)

1 Ответ

2 голосов
/ 08 ноября 2011

Предполагая, что вы учитываете ВСЕ последствия того, что вы делаете, ВСЕ, как это может пойти не так, что вы будете делать, когда получите китайские пиктограммы и другие вещи, которые не имеют эквивалента в латинском алфавите ...

Нет библиотеки, о которой я знаю, которая делает то, что вы хотите.Если у вас есть список эквивалентностей (как вы говорите, от 'æ' до 'ae' или любой другой), вы можете сохранить их в файле (или, если вы делаете это много, в отсортированном массиве в памяти,по соображениям производительности), а затем сделать поиск и заменить на символ.Если у вас есть место в памяти для хранения (# символов Unicode) в виде массива char, наиболее эффективным будет возможность проходить через значения Unicode для каждого символа и выполнять прямой поиск.

ie, / u1234 => lookupArray [1234] => 'q'

или что угодно.

, поэтому у вас будет цикл, который выглядит следующим образом:

StringBuffer buf = new StringBuffer();
for (int i = 0; i < string.length(); i++) {
  buf.append(lookupArray[Character.unicodeValue(string.charAt(i))]);
}

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

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

Удачи - яуверен, это чревато подводными камнями.

...