Лучший способ узнать, содержит ли текст, включенный в строку Java, символы в кодировке UTF-8 или нет - PullRequest
4 голосов
/ 22 марта 2012

Есть ли другой способ узнать, содержит ли java String character-encoding в кодировке UTF-8 или нет, например, арабские слова.

Я попробовал этот код: но он точен и делает работу?

char c = 'أ';
int num = (int) c;

if(num> 128)
// then UTF-8 characters exists 

Ответы [ 3 ]

2 голосов
/ 22 марта 2012

(при условии UTF-8 == не ASCII)

Что вы можете сделать, это кодировать, затем декодировать строку в ASCII и сравнить результат этого с оригиналом. Если они не равны, есть символы не ASCII.

Тем не менее, ваш собственный образец тоже будет работать (почти, должно быть >= 128), потому что следующее доказывает, что все char s < 128 действительно являются ASCII:

Для обеспечения обратной совместимости 128 символам ASCII и 256 символов ISO-8859-1 (латинская 1) назначаются кодовые точки Unicode / UCS, которые совпадают с их кодами в более ранних стандартах.

Первая плоскость (кодовые точки от U + 0000 до U + FFFF) содержит наиболее часто используемые символы и называется базовой многоязычной плоскостью или BMP. И UTF-16, и UCS-2 кодируют действительные кодовые точки в этом диапазоне как единичные 16-битные кодовые единицы, которые численно равны соответствующим кодовым точкам.

(«UTF-16» и «ASCII», Википедия)

И char s - это «кодовые единицы» UTF-16.


Однако, судя по полному вопросу, вам, возможно, было бы лучше прочесть Абсолютный минимум для каждого разработчика программного обеспечения Абсолютно, положительно необходимо знать о Unicode и наборах символов (никаких оправданий!) сначала.

1 голос
/ 22 марта 2012

Java (внутренне) всегда кодирует String в UTF-16 независимо от его содержимого.http://docs.oracle.com/javase/6/docs/api/java/lang/String.html

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

В зависимости от того, почему вы проверяете,Вы можете преобразовать строку в ASCII и прочитать ее обратно в строку Java и посмотреть, совпадают ли они.Если это так, ASCII достаточно для хранения вашей строки.Это будет наиболее очевидной проверкой для более поздних читателей вашего исходного кода.

Вы также можете сравнить кодовую точку Unicode каждого символа с 128, если они все <= 127, строка является ASCII-совместимой, т.е.не содержит арабскийЧтобы получить кодовую точку Unicode для символа вашей строки, используйте <code>str.codePointAt(index).

Если вы явно хотите найти арабский текст, вы должны явно проверить наличие арабских символов.В противном случае вы можете получить ложные срабатывания для французского, немецкого или многих других языков, которые используют символы с акцентом.К счастью, консорциум Unicode связывает блоки для каждого языка, так что проверка, скорее всего, сводится к cp >= beginningOfUnicodeBlock && cp <= endOfUnicodeBlock.

Edit, намекает tchrist: Есть java.lang.Character.UnicodeBlockи java.lang.Character.UnicodeScript.Последний был добавлен в Java 7. Оба могут использоваться для классификации кодовых точек Юникода.

int cp = str.codePointAt(index);
if (UnicodeScript.ARABIC.equals(UnicodeScript.of(cp)) {
    // arabic character found
}
0 голосов
/ 22 марта 2012

Я не верю, что есть точный способ узнать со 100% точностью.UTF-8 и UTF-16 могут поставляться с дополнительной меткой порядка байтов , которую вы можете обнаружить.Там нет гарантии, что он будет там, но многие инструменты включают их, особенно для UTF-16, поскольку это более важно.

Apache Commons IO включает в себя удобный класс BOMInputStream для чтения BOMотмеченные потоки, которые просты в использовании:

BOMInputStream bomIn = new BOMInputStream(in);
if (bomIn.hasBOM()) {
    // has a UTF-8 BOM
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...