2009-12-01 2 views
8

У меня есть вариант bstr, который был вытащен из MSXML DOM, поэтому он находится в UTF-16. Я пытаюсь выяснить, какая кодировка по умолчанию происходит с этим преобразованием:Кодировка по умолчанию для варианта bstr для std :: string conversion

VARIANT vtNodeValue; 
pNode->get_nodeValue(&vtNodeValue); 
string strValue = (char*)_bstr_t(vtNodeValue); 

От тестирования, я считаю, что кодировка по умолчанию, либо Windows-1252 или Ascii, но я не уверен.

Btw, это кусок кода, который я исправляю и преобразовываю вариант в wstring и переходя к многобайтовой кодировке с вызовом WideCharToMultiByte.

Спасибо!

ответ

10

Метод operator char*_com_util::ConvertBSTRToString(). The documentation довольно бесполезен, но я предполагаю, что он использует текущие настройки локали для преобразования.

Update:

Внутренне _com_util::ConvertBSTRToString() вызовы WideCharToMultiByte, проходя ноль для всех кодовых страниц, и символов по умолчанию параметров. Это то же самое, что и передача CP_ACP, что означает использование текущей кодовой страницы системы ANSI (а не текущей настройки потока).

Если вы хотите избежать потери данных, вы должны позвонить по телефону WideCharToMultiByte и использовать CP_UTF8. Вы все равно можете обрабатывать строку как однобайтную строку с нулевым завершением и использовать std::string, вы просто не можете обрабатывать байты как символы.

+2

Спасибо !!! Кодовая страница по умолчанию для US Windows - 1252, что соответствует тому, что я наблюдал. Это можно определить на любом компьютере с этим вызовом: \t int nCodePage = GetACP(); – 2009-12-01 20:48:43

0

std::string сам по себе не указывает/не содержит кодировки. Это всего лишь последовательность байтов. То же самое верно для std::wstring, который представляет собой просто последовательность wchar_t s (двухбайтовые слова, на Win32).

Преобразование _bstr_t в char* через его operator char*, вы просто получите указатель на необработанные данные. According to MSDN, эти данные состоят из широких символов, то есть wchar_t s, которые представляют собой UTF-16.

Я удивлен, что он действительно работает, чтобы построить std::string; вам не следует пропустить первый нулевой байт (что происходит в ближайшее время, если ваша исходная строка - английская).

Но поскольку wstring является строка wchar_t, вы должны быть в состоянии построить один непосредственно из _bstr_t, следующим образом:

_bstr_t tmp(vtNodeValue); 
wstring strValue((wchar_t*)tmp, tmp.length()); 

(я не уверен length, это число байтов или количество символов?) Затем у вас будет wstring, который закодирован в UTF-16, на котором вы можете позвонить WideCharToMultiByte.

+0

Неправильно, это не актерский состав, 'bstr_t' имеет определяемый' operator char * ', который делает преобразование внутренне. –

+0

Я знаю. Не подходит ли слово «cast»? Может быть, «оператор конверсии» лучше. Я изменю его. – Thomas

+0

Это неверно: отбрасывание '_bstr_t' в' char * 'вызывает функцию' _com_util :: ConvertBSTRToString' для преобразования строки в байтовую кодировку. – interjay