Как проверить правильность строки в формате UTF-8?
Проверьте, действительно ли строка имеет UTF-8, закодированную в Java
Ответ 1
Можно проверить только байтовые данные. Если вы построили String, то это уже в UTF-16 внутри.
Также могут быть закодированы кодировки байтов только.
Вот общий пример конверсий UTF-8.
String myString = "\u0048\u0065\u006C\u006C\u006F World";
System.out.println(myString);
byte[] myBytes = null;
try
{
myBytes = myString.getBytes("UTF-8");
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
System.exit(-1);
}
for (int i=0; i < myBytes.length; i++) {
System.out.println(myBytes[i]);
}
Если вы не знаете кодировку вашего байтового массива, juniversalchardet - это библиотека, которая поможет вам ее обнаружить.
Ответ 2
Следующая запись взята из официальных обучающих программ Java, доступных по адресу: https://docs.oracle.com/javase/tutorial/i18n/text/string.html.
Программа StringConverter начинается с создания строки, содержащей Юникодные символы:
String original = new String("A" + "\u00ea" + "\u00f1" + "\u00fc" + "C");
При печати строка с именем оригинала выглядит как:
AêñüC
Чтобы преобразовать объект String в UTF-8, вызовите метод getBytes и укажите соответствующий идентификатор кодировки в качестве параметра. Метод getBytes возвращает массив байтов в формате UTF-8. Чтобы создать Строковый объект из массива байтов, не относящихся к Юникоду, вызывает строку конструктор с параметром кодирования. Код, который делает эти вызовы заключены в блок try, в случае, если указанная кодировка неподдерживаемый:
try { byte[] utf8Bytes = original.getBytes("UTF8"); byte[] defaultBytes = original.getBytes(); String roundTrip = new String(utf8Bytes, "UTF8"); System.out.println("roundTrip = " + roundTrip); System.out.println(); printBytes(utf8Bytes, "utf8Bytes"); System.out.println(); printBytes(defaultBytes, "defaultBytes"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
Программа StringConverter выводит значения в utf8Bytes и defaultBytes массивы, чтобы продемонстрировать важный момент: длина преобразованный текст может быть не таким, как длина источника текст. Некоторые символы Unicode переводятся в одиночные байты, другие - в пары или триплеты байтов. Метод printBytes отображает байтовые массивы, вызывая метод byteToHex, который определяется в исходном файле, UnicodeFormatter.java. Вот метод printBytes:
public static void printBytes(byte[] array, String name) { for (int k = 0; k < array.length; k++) { System.out.println(name + "[" + k + "] = " + "0x" + UnicodeFormatter.byteToHex(array[k])); } }
Далее выводится вывод метода printBytes. Обратите внимание, что только первые и последние байты, символы A и C, одинаковы в обоих массивах:
utf8Bytes[0] = 0x41 utf8Bytes[1] = 0xc3 utf8Bytes[2] = 0xaa utf8Bytes[3] = 0xc3 utf8Bytes[4] = 0xb1 utf8Bytes[5] = 0xc3 utf8Bytes[6] = 0xbc utf8Bytes[7] = 0x43 defaultBytes[0] = 0x41 defaultBytes[1] = 0xea defaultBytes[2] = 0xf1 defaultBytes[3] = 0xfc defaultBytes[4] = 0x43