Проверьте, является ли String действительным UTF-8, закодированным в Java - PullRequest
36 голосов
/ 08 июля 2011

Как я могу проверить, соответствует ли строка допустимому формату UTF-8?

Ответы [ 2 ]

34 голосов
/ 08 июля 2011

Могут быть проверены только байтовые данные.Если вы создали строку, то она уже находится внутри UTF-16.

Также только байтовые массивы могут быть закодированы в UTF-8.

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

1 голос
/ 06 июня 2017

Следующий пост взят из официальных руководств по 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. Чтобы создать Объект String из массива байтов, отличных от Unicode, вызывает строку конструктор с параметром кодирования. Код, который делает эти звонки заключены в блок 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...