Различение между строковыми форматами - PullRequest
2 голосов
/ 03 декабря 2010

Имея нетипизированный указатель, указывающий на некоторый буфер, который может содержать строку ANSI или Unicode, как мне узнать, является ли текущая строка, которую он содержит, многобайтовой или нет?

Ответы [ 3 ]

9 голосов
/ 03 декабря 2010

Если сама строка не содержит информацию о своем формате (например, заголовок или метка порядка байтов ), то нет надежного способа определить, является ли строка ANSI или Unicode. Windows API включает функцию с именем IsTextUnicode(), которая в основном угадывает, является ли строка ANSI или Unicode, но , тогда вы сталкиваетесь с этой проблемой , потому что вам приходится угадывать .

Почему у вас нетипизированный указатель на строку? Вы должны точно знать, что и как ваши данные представляют информацию, либо используя сначала напечатанный указатель, либо указав флаг ANSI / Unicode или что-то еще. Строка байтов не имеет смысла, если вы не знаете точно, что она представляет.

5 голосов
/ 03 декабря 2010

Unicode - это , а не кодировка, это отображение кодовых точек на символы. Например, кодировка - это UTF8 или UCS2.

И, учитывая, что ноль разница между кодировкой ASCII и UTF8, если вы ограничиваете себя младшими 128 символами, вы на самом деле не можете сказать разницу

Вам лучше спросить, есть ли способ определить разницу между ASCII и конкретной кодировкой Unicode. И ответом на это является использование статистического анализа с присущей ему ошибкой.

Например, если вся строка состоит из байтов, меньших 128, это ASCII (это может быть UTF8, но в этом случае нет никакого способа узнать и нет разницы).

Если это в основном английский / римский язык и состоит из множества двухбайтовых последовательностей с нулем в качестве одного из байтов, это, вероятно, UTF16. И так далее. Я не верю, что есть надежный метод без какого-либо индикатора (например, спецификации).

Я предлагаю не ставить себя в положение, в котором вы должны угадывать. Если сам тип данных не может содержать индикатор, предоставьте различные функции для ASCII и определенную кодировку Unicode. Затем навязывайте работу своему клиенту. В какой-то момент в иерархии вызовов кто-то должен теперь кодировать.

Или, еще лучше, полностью отказаться от ASCII, охватить новый мир и использовать исключительно Юникод. С кодировкой UTF8, ASCII имеет ровно нет преимуществ по сравнению с Unicode: -)

2 голосов
/ 03 декабря 2010

В общем, вы не можете

Вы могли бы проверить шаблон нулей - только один в конце, вероятно, означает ANSI 'C', каждый байт ноль, вероятно, означает ANSI текст как UTF16, 3 нуля может быть UTF32

...