2013-02-01 145 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