2013-01-21 45 views
1

我們使用WinHttp.WinHttpRequest.5.1調用第三方Web服務的舊C++應用程序。將BSTR轉換爲char的問題*

我不會列出呼叫順序的所有細節,因爲我不認爲它與問題有關,但我們通過呼叫hr = pIWinHttpRequest->get_ResponseText(&bstrResponse);完成,其中bstrResponse是BSTR類型。

調用代碼不BSTRs工作,其工作原理與標準的C/C++ char *的,所以代碼的BSTR轉換爲char *有:

_bstr_t b(bstrResponse); 
const char *c = static_cast<char *>(b); 

而且所有之前的WebServices我們已經用這段代碼訪問過,這個工作。但對於這個新的,它不是。

我們找回的數據應該是XML,但對於這一個Web服務,它看起來像我們正在得到一些字符代碼轉換問題。我們的結果字符串以; "?&lt;?xml version="1.0" encoding="utf-8"?&gt;..."

注意額外的?開頭。在調試器中瀏覽時,我們沒有看到顯示值爲bstrResponse,我們沒有在顯示的值b中看到它,但我們確實在顯示的值c中看到它。

關於可能發生什麼的任何想法?

EDITED

我明白,BSTR是一個多字節類型,但都在這個字符串中的字符是純ASCII,並沒有調用該函數可以處理多字節字符的代碼。瀏覽網頁時,我經常看到這種特定的機制,但在這種情況下,它不起作用。

我需要將此字符串從BSTR轉換爲單字節字符數組。即使這意味着刪除無法轉換的多字節字符。

+0

它不起作用,因爲BSTR不是一個字節長度字符串。我詳細介紹了你[這個問題](http://stackoverflow.com/questions/6284524/bstr-to-stdstring-stdwstring-and-vice-versa)。 –

+0

你可能認爲'static_cast'可能不是將任意類型轉換爲可打印'char *'字符串的有效方法嗎? ;) – jalf

+0

我明白BSTR是一個多字節類型,但是這個字符串中的所有字符都是純ASCII,並且沒有任何調用此函數的代碼可以處理多字節字符。 –

回答

2

使用static_cast_bstr_t上的代碼轉換正確轉換爲ANSI。在編碼轉換中出現?表示字符轉換失敗。最可能的原因是bstrResponse包含ANSI代碼頁中不存在的字符。我希望你應該轉換爲UTF-8而不是ANSI,但是我當然沒有獲得所有的信息。

底線是?表示源字符串包含無法在目標字符集中編碼的字符。

更新

你的答案提供了進一步的證據,你應該轉換爲UTF-8。只有你能夠確定地知道,但你提出的證據與這個結論是一致的。

+0

如果字符串包含BOM –

+0

我不明白你的意思。看看你發佈的答案,似乎我的分析是準確的。 –

+0

我並不反對你。因爲這個字符串有一個BOM,所以轉換後的第一個字符是'?'。 –

0

原來有兩個問題。首先,上面描述的轉換過程不會去掉字節順序標記,這在我看來應該是這樣,第二個是我們在8位ASCII字符上使用扼流器的舊C++ XML解析器,並且這個web服務正在發送我們在他們的文本中有一個版權符號,ASCII'\ xA9'。

隨着BOM剝離和高位字符被空格替換,解析器工作正常。

+1

爲什麼你會期望從UTF-16到ANSI的轉換去掉BOM?這是關於文本編碼的更高層次的關注。 –

+0

幾乎可以肯定你的XML解析器反對被ANSI文本而不是UTF-8。 –