簡體   English   中英

變量bstr到std :: string轉換的默認編碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM