Как обнаружить символы Юникода в строке Java?

Предположим, у меня есть строка, которая содержит Ü. Как бы я нашел все эти символы Unicode? Должен ли я проверить их код? Как бы я это сделал?

Например, учитывая строку "AÜXÜ", я хотел бы преобразовать ее в "AYXY". Я хотел бы сделать то же самое для других символов Юникода, и я не хотел бы хранить их в какой-либо карте перевода.

6 ответов

Решение

Определение "символы Юникода" является расплывчатым, но оно будет означать символы UTF-8, не охватываемые стандартной кодировкой ISO 8859. Если это верно в вашем случае, то переберите все символы в строке и проверьте ее кодовую точку, чтобы определить, находится ли она в заданном наборе символов.

В качестве альтернативы используйте Map<Character, Character> и символы на карте, которые содержат соответствующие ключи. Например:

Map<Character, Character> charReplacementMap = new HashMap<Character, Character>() {{
    put('Ü', 'Y');
    // Put more here.
}};

String originalString = "AÜAÜ";
StringBuilder builder = new StringBuilder();

for (char currentChar : originalString.toCharArray()) {
    Character replacementChar = charReplacementMap.get(currentChar);
    builder.append(replacementChar != null ? replacementChar : currentChar);
}

String newString = builder.toString();

Или вы имеете в виду "все символы с диакритическими знаками"? Если так, то используйте java.text.Normalizer удалить диакритические знаки:

/**
 * Remove any diacritical marks (accents like ç, ñ, é, etc) from
 * the given string (so that it returns plain c, n, e, etc).
 * @param string The string to remove diacritical marks from.
 * @return The string with removed diacritical marks, if any.
 */
public static String removeDiacriticalMarks(String string) {
    return Normalizer.normalize(string, Form.NFD)
        .replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
}

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

Вы можете перебрать вашу строку и для каждого вызова символа

If (Character.UnicodeBlock.of(c) != Character.UnicodeBlock.BASIC_LATIN) {
 // replace with Y
}

Вы можете пойти другим путем и спросить, является ли персонаж персонажем ascii.

public static boolean isAscii(char ch) {
    return ch < 128;
}

Тогда вам, конечно, придется анализировать строку char по char.

(этот метод взят из Charonstil'а, который содержит множество полезных методов символов)

Мне не совсем ясно, что именно получается при преобразовании "AÜXÜ" в "AYXY". Это потому, что Y произносится как Y на определенном языке? Какой язык? И какие еще правила могут применяться?


С точки зрения терминологии...

"a"

Выше приведена строка Unicode. Он содержит один кодированный символ UTF-16.

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

Я не уверен из вашего примера, что вы пытаетесь сделать - если вы просто пытаетесь заменить все не-ASCII-значения на Y, то вы можете перебрать строку, ища кодовые точки вне диапазона от 0 до 127, и заменить их эти кодовые точки с Y.

Класс Character также предлагает несколько интересных методов. Посмотри на это.

Character.UnicodeBlock.of('a') == Character.UnicodeBlock.BASIC_LATIN; //true

Character.UnicodeBlock.of('�') == Character.UnicodeBlock.BASIC_LATIN; //false
Другие вопросы по тегам