2013-02-01 95 views
1

我試圖能夠發送字符「Т」(不正常的資本噸,unicode的十進制值1058)從C++到VBC++字符串編碼UTF8/unicode的

然而,用這種方法進行的返回信息到VB,它顯示爲「Т」,這是以ANSI編碼的上述字符。

#if defined(_MSC_VER) && _MSC_VER > 1310 
# define utf8(str) ConvertToUTF8(L##str) 
const char * ConvertToUTF8(const wchar_t * pStr) { 
    static char szBuf[1024]; 
    WideCharToMultiByte(CP_UTF8, 0, pStr, -1, szBuf, sizeof(szBuf), NULL, NULL); 
    return szBuf; 
} 
#else 
# define utf8(str) str 
#endif 


BSTR _stdcall chatTest() 
{ 
    BSTR Message; 
    CString temp("temp test"); 
    temp+=utf8("\u0422"); 
    int len = temp.GetLength(); 
    Message = SysAllocStringByteLen ((LPCTSTR)temp, len+1); 
    return Message; 
} 

如果我只是做temp + =(「\ u0422」);沒有utf8功能。它將數據發送爲「?」它實際上是一個問號(有時unicode字符在VB中顯示爲問號,但仍然有正確的unicode十進制值..這裏不是這種情況...它將其更改爲問號

In VB如果我輸出的字符串變量有消息時,它的數據是「Т」到一個文本文件它顯示爲「Т」

所以據我可以告訴它在UTF8的C + +,然後以某種方式在VB中轉換爲ANSI(或在它發送之前),然後當輸出到一個文件時,它變回UTF8?我只需要在從C++發送到VB時保持「Т」不變。 VB字符串可以容納該字符,因爲來自另一個字符串在VB內我可以存儲它(它顯示爲「?」,但具有適當的Unicode十進制值)。

任何幫助是極大的讚賞。

感謝

+1

爲什麼要用這樣一個美麗的語言如C++,然後使用VB毀了嗎? :P –

+1

您可能需要閱讀http://stackoverflow.com/a/6072627/13760的細節如何C++ 11個解決了這個問題你:) – Carl

+0

宇宙先生,因爲我吸:) – user1088794

回答

1

一個BSTR是不是UTF-8,這是UTF-16,它是你與L""前綴得到。取出UTF-8轉換並使用CStringW。並使用LPCWSTR而不是LPCTSTR

+0

。我得到錯誤 'SysAllocStringByteLen':無法從 'LPCWSTR' 到 'LPCSTR' – user1088794

+0

轉換參數1 @ user1088794嘗試使用'SysAllocStringLen'代替。 –

+0

不起作用。當它發送給VB時,它仍然將字符轉換爲「?」。所有角色之間也有差距。 – user1088794