[英]Default encoding for variant bstr to std::string conversion
我有一個從MSXML DOM中提取的變體bstr,所以它是UTF-16。 我試圖找出此轉換發生的默認編碼:
VARIANT vtNodeValue;
pNode->get_nodeValue(&vtNodeValue);
string strValue = (char*)_bstr_t(vtNodeValue);
從測試來看,我認為默認編碼是Windows-1252或Ascii,但我不確定。
順便說一句,這是我正在修復的代碼塊,並將變量轉換為wstring,並通過調用WideCharToMultiByte進行多字節編碼。
謝謝!
operator char*
方法調用_com_util::ConvertBSTRToString()
。 該文檔非常無用,但我認為它使用當前的語言環境設置來進行轉換。
更新:
在內部, _com_util::ConvertBSTRToString()
調用WideCharToMultiByte
,為所有代碼頁和默認字符參數傳遞零。 這與傳遞CP_ACP
相同,這意味着使用系統當前的ANSI代碼頁設置(而不是當前的線程設置)。
如果您想避免丟失數據,您應該直接調用WideCharToMultiByte
並使用CP_UTF8
。 您仍然可以將字符串視為以空字符結尾的單字節字符串並使用std::string
,您只是不能將字節視為字符。
std::string
本身不指定/包含任何編碼。 它只是一個字節序列。 對於std::wstring
,它只是wchar_t
的序列(Win32上的雙字節字)。
通過轉換_bstr_t
到一個char*
通過其運營的char *中,只要獲得一個指向原始數據。 根據MSDN ,這個數據由寬字符組成,即wchar_t
,代表UTF-16。
我很驚訝它實際上可以從這個構造一個std::string
; 你不應該超過第一個零字節(如果您的原始字符串是英語,則很快就會出現)。
但由於wstring
是一個wchar_t
字符串,您應該能夠直接從_bstr_t
構造一個,如下所示:
_bstr_t tmp(vtNodeValue);
wstring strValue((wchar_t*)tmp, tmp.length());
(我不確定length
;它是字節數還是字符數?)然后,你將有一個以UTF-16編碼的wstring
,你可以在其上調用WideCharToMultiByte
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.