Использование функций обработки узких строк для широких данных - PullRequest
1 голос
/ 02 июня 2011

Я анализирую XML-файл, который может содержать локализованные строки на разных языках (на данный момент это просто английский и испанский, но в будущем это может быть любой язык), API для синтаксического анализатора XML возвращает все данные в пределах XML через символ *, который закодирован в UTF8.

Некоторые операции с данными требуются после их анализа (поиск в них подстрок, объединение строк, определение длины подстрок и т. Д.).

Было бы удобно использовать стандартные функции, такие как strlen, strcat и т. Д. Поскольку необработанные данные, которые я получаю от синтаксического анализатора XML, являются символами * Я могу легко выполнять все манипуляции с помощью этих стандартных функций обработки строк.

Однако все это, конечно, предполагает и требует, чтобы строки заканчивались на NULL. Поэтому мой вопрос - если у вас есть широкие данные, представленные как char *, может ли символ NULL-терминатор встречаться внутри данных, а не в конце?

т.е. если символу определенного языка не требуется 2 байта для его представления, и он представлен одним байтом, будет / может ли другой байт иметь значение NULL?

Ответы [ 2 ]

3 голосов
/ 02 июня 2011

UTF-8 не "широкий". UTF-8 - это многобайтовая кодировка, где символ Unicode может занимать от 1 до 4 байтов. UTF-8 не будет иметь нулевых терминаторов внутри допустимого символа. Убедитесь, что вы не запутались в том, что дает вам ваш парсер. Это может быть UTF-16 или UCS2 или их 4-байтовые эквиваленты, помещенные в строки широких символов, и в этом случае вы должны рассматривать их как широкие строки.

0 голосов
/ 02 июня 2011

C различает многобайтовые символы и широкие символы :

  • Широкие символы должны быть в состоянии представить любой символ набора символов выполнения, используя точно такое же количество байтов (например, если 兀 принимает 4 байта для представления, A также должна занимать 4 байта быть представленным). Примерами кодировок широких символов являются UCS-4 и устаревший UCS-2.

  • Многобайтовые символы могут занимать различное количество байтов для представления. Примерами многобайтовых кодировок являются UTF-8 и UTF-16.

При использовании UTF-8 вы можете продолжать использовать функции str*, но имейте в виду, что они не обеспечивают способ возврата длины в символах строки необходимо преобразовать в широкие символы и использовать wcslen. strlen возвращает длину в байтах , а не символах , что полезно в различных ситуациях.

Я не могу не подчеркнуть, что все элементы набора символов выполнения должны быть представлены в одном широком символе предварительно определенного размера в байтах. Некоторые системы используют UTF-16 для широких символов, в результате чего реализация не может соответствовать стандарту C, а некоторые функции wc* не могут работать правильно.

...