2009-12-01 5 views
8

MSXML DOM에서 가져온 변형 bstr이 있으므로 UTF-16이됩니다. 테스트에서변형 bstr 대 std :: string 변환의 기본 인코딩

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

, 나는 기본 인코딩은 윈도우 1252 또는 ASCII 중 하나라고 생각하지만, 확실하지 않다 : 나는 기본 인코딩이 변환에 어떤 일이 발생하는지 알아 내려고 노력하고있어.

Btw, 이것은 변형 코드를 wstring으로 변환하고 WideCharToMultiByte를 호출하여 멀티 바이트 인코딩으로 이동하는 코드입니다.

감사합니다.

답변

10

operator char* 메서드는 _com_util::ConvertBSTRToString()을 호출합니다. The documentation은 도움이되지 않지만 현재 로캘 설정을 사용하여 변환을 수행한다고 가정합니다.

업데이트 :

내부적으로 모든 코드 페이지와 기본 문자 매개 변수에 대해 0을 통과 _com_util::ConvertBSTRToString() 전화 WideCharToMultiByte. 이는 CP_ACP을 전달하는 것과 동일합니다. 이는 시스템의 현재 ANSI 코드 페이지 설정 (현재 스레드 설정 아님)을 사용함을 의미합니다.

데이터 손실을 방지하려면 WideCharToMultiByte으로 직접 전화하고 CP_UTF8을 사용해야합니다. 이 문자열을 여전히 null로 끝나는 단일 바이트 문자열로 처리하고 std::string을 사용하면 바이트 만 문자로 처리 할 수 ​​없습니다.

+2

감사합니다 !!! 미국 Windows의 기본 코드 페이지는 1252이며 이는 내가 관찰 한 코드와 일치합니다. 이 호출을 사용하는 모든 컴퓨터에서 확인할 수 있습니다. \t int nCodePage = GetACP(); –

0

std::string 그 자체로는 인코딩을 지정하거나 포함하지 않습니다. 이것은 단순히 일련의 바이트입니다. wchar_t (Win32에서는 더블 바이트 단어)의 시퀀스 인 동일한 내용의 std::wstring도 마찬가지입니다.

_bstr_t을 에서 operator char*으로 변환하면 원시 데이터에 대한 포인터 만 가져옵니다. According to MSDN 인 경우이 데이터는 넓은 문자, 즉 wchar_t으로 구성되며 UTF-16을 나타냅니다.

실제로 이것으로 std::string을 구성하는 것이 놀랍습니다. 첫 번째 0 바이트를 지나쳐서는 안됩니다 (원래 문자열이 영어 인 경우 곧 발생합니다).

그러나 wstringwchar_t의 캐릭터이기 때문에 다음과 같이는 _bstr_t에서 직접 하나를 구성 할 수 있어야한다 :

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

(나는 length에 대해 확실하지 않다, 그것은 바이트의 수 또는 문자 수를 나타냅니다.) 그러면 WideCharToMultiByte으로 전화 할 수있는 UTF-16으로 인코딩 된 wstring이 생성됩니다.

+0

맞지 않아 실제로 캐스트가 아니며 'bstr_t'는 내부적으로 변환을 수행하는'연산자 char * '를 정의합니다. –

+0

알아. "캐스트"라는 단어가 부적절한가요? 어쩌면 "변환 연산자"가 더 좋습니다. 내가 바꿀거야. – Thomas

+0

올바르지 않습니다 :'_bstr_t'를'char *'로 형변환하면'_com_util :: ConvertBSTRToString' 함수가 호출되어 문자열을 바이트 기반 인코딩으로 변환합니다. – interjay