Подтвердить что ты не робот

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

Предположим, что у меня есть строка, содержащая Ü. Как мне найти все эти символы Юникода? Должен ли я проверить свой код? Как мне это сделать?

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

4b9b3361

Ответ 1

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

В качестве альтернативы используйте 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. Не уверен, что это вам. Если вы хотите заменить выраженным символом, вам действительно нужно создать сопоставление. Конечно, это утомительная работа, но это было сделано за меньшее время, чем вам нужно было следовать этой теме.

Ответ 2

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

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

Ответ 3

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

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

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

(метод от commons-lang Charutils, который содержит множество полезных методов Character)

Ответ 4

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


В терминах терминологии...

"a"

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

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

Ответ 5

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

Ответ 6

Класс Character также предлагает некоторые интересные методы. Взгляните на это.

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

Character.UnicodeBlock.of('�') == Character.UnicodeBlock.BASIC_LATIN; //false