Байтовый массив в UTF8 CString - PullRequest
2 голосов
/ 19 февраля 2010

Я использую Visual Studio 2008 (C ++). Как мне создать CString (в приложении, отличном от Unicode) из байтового массива, в котором есть строка, закодированная в UTF8?

Спасибо

Креб

РЕДАКТИРОВАТЬ: Уточнение: я думаю, что я спрашиваю ... CStringA, кажется, не в состоянии интерпретировать строку UTF8 как UTF8, а скорее как ASCII или текущую кодовую страницу (я думаю) .. Как преобразовать эту строку UTF8 в CStringW? (UTF-16 ..?) Спасибо

Ответы [ 4 ]

3 голосов
/ 19 февраля 2010

CStringW filename= CA2W(null_terminated_byte_buffer, CP_UTF8) должен сделать свое дело.

0 голосов
/ 22 марта 2011

После ответа "MSN" выше я думаю, что в конечном итоге вам понадобится CString, а не CStringW. Поэтому добавьте преобразование обратно в CString:

CStringW filenameW = CA2W (null_terminated_byte_buffer, CP_UTF8); CString filename = CW2T (filenameW);

0 голосов
/ 19 февраля 2010

Для большинства вещей вы можете обращаться с UTF8 так же, как с ASCII.

unsigned char szUtf8String[nSize] = "whatever";
CString s = static_cast<char *>(szUtf8String);

Это работает для манипулирования и записи в файл. Однако вы не можете легко отобразить строку, она будет обрабатывать ее как ASCII и неправильно интерпретировать любые неанглийские символы.

Чтобы отобразить его, вам нужно будет конвертировать в UTF16 и, возможно, затем обратно в ANSI (в локальной кодовой странице).

0 голосов
/ 19 февраля 2010

Приятной особенностью UTF8 является то, что каждая строка UTF8 также является допустимой строкой C, заканчивающейся NUL.Это означает, что вы должны иметь возможность просто привести указатель на первый символ байтового массива в виде (const char *) и передать его в CString, как если бы вы использовали любую строку C с NUL-концевыми символами.

Обратите внимание, чтоесли CString не знает о семантике UTF8 (я не достаточно знаком с CString, чтобы точно знать, как он работает, но я подозреваю, что нет), некоторые операции, имеющие смысл в строке C ASCII, могут давать странные результаты для строки C UTF8,Например, метод Reverse (), который меняет порядок следования байтов в строке, не будет делать правильных вещей для строки UTF8, поскольку он не будет знать, как хранить многобайтовые символы вместе в исходном порядке, и обратитбайты многобайтового символа.

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