ищу образцы для проверки UTF-8 - PullRequest
3 голосов
/ 15 мая 2009

Предположим, у меня есть поток байтов (массив), и я хочу написать код (используя .Net C #), чтобы проверить, является ли это действительной последовательностью байтов UTF-8 или нет. Я хочу написать код с нуля, потому что мне нужно сообщить точное местоположение, где есть недопустимые последовательности байтов и даже можно удалить недопустимые байты, а не просто получить да или нет о том, является ли поток / массив байтов действительным.

Есть ли примеры кодов, на которые можно ссылаться? Если нет кода на C #, простые примеры на C ++ / Java также приветствуются. Спасибо!

Для недопустимых байтовых последовательностей UTF-8 я имею в виду

http://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences

спасибо заранее, George

Ответы [ 4 ]

3 голосов
/ 15 мая 2009

Что вам нужно, это DecoderFallback . Когда класс Encoding пытается преобразовать последовательность байтов в целевую кодировку, вы можете указать альтернативное поведение:

Используя UTF8Encoding и DecoderReplacementFallback, вы можете достичь именно того, что ищете.

2 голосов
/ 21 мая 2009

Это то, о чем просил оригинальный вопрос, даже если это не совсем то, что действительно требовалось оригинальному постеру. Однако я написал и написал некоторый C-код для проверки потока байтов как utf-8 и сделал его доступным бесплатно. Может быть, кто-то другой, направивший этот вопрос через поиск в Google, сочтет его полезным.

Он занимает один байт за раз, поэтому подходит для потоковой обработки и классифицирует все либо в допустимый UTF-8, либо в одну из следующих возможных ошибок в последовательности байтов:

/* Ways a UTF stream can screw up */
/* a multibyte sequence without as many continuation bytes as expected.  e.g. [ef 81] 48 */
#define MISSING_CONTINUATION 1 
/* A continuation byte when not expected */
#define UNEXPECTED_CONTINUATION 2 
/* A full multibyte sequence encoding something that should have been encoded shorter */
#define OVERLONG_FORM 3
/* A full multibyte sequence encoding something larger than 10FFFF */
#define OUT_OF_RANGE 4
/* A full multibyte sequence encoding something in the range U+D800..U+DFFF */
#define BAD_SCALAR_VALUE 5
/* bytes 0xFE or 0xFF */
#define INVALID 6

Этот валидатор обладает приятным свойством: если a и b являются допустимыми потоками байтов utf-8, а x является другим потоком байтов, то конкатенация a + x + b будет декодирована как все символы, закодированные в a , некоторая комбинация символов и ошибок, тогда все символы закодированы в x . То есть недопустимая последовательность байтов не может содержать правильно закодированные символы, которые начинаются после неправильных байтов.

1 голос
/ 10 июля 2015
static void CheckUTF8(byte[] data)
{
    new UTF8Encoding(false, true).GetCharCount(data);
}

Бросает DecoderFallbackException на недопустимые данные. DecoderFallbackException.Index должен указывать на индекс неверной последовательности.

1 голос
/ 15 мая 2009

Хороший вопрос. Я не знал, что существуют недопустимые последовательности UTF-8.

Статья в Википедии - отправная точка, но я не думаю, что вы можете пройти полный тест. Ты можешь? Я заинтересован

Полный тест означает, что для каждой последовательности у вас может быть функция, которая отвечает да или нет для каждой возможной последовательности. Полная функция.

Смысл в том, что делать или возвращать, если ваша последовательность не завершена (короткая последовательность). Насколько я знаю, есть некоторые редакторы, которые добавляют специальный символ для его выполнения. Возможно, вам следует обработать такие случаи как недопустимые последовательности, и тогда ваш тест будет завершен. Интересно, это единственный случай?

Во всяком случае, я буду ставить этот вопрос в качестве фаворита, чтобы отслеживать ответы. Конечно, кто-то осветит нас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...