C ++字符串编码UTF8 / unicode

时间:2013-02-01 03:24:59

标签: c++

我试图能够将字符“Т”(不是正常的大写字母t,unicode十进制值1058)从C ++发送到VB

但是,使用下面的方法将Message返回给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十进制值..这不是这里的情况......它将其更改为问号。

在VB中,如果我将带有来自Message的数据的String变量输出到文本文件,则它显示为“Т”。

因此我可以在C ++中用UTF8告诉它,然后以某种方式在VB中(或在它发送之前?)转换为ANSI,然后当输出到文件时它变回UTF8?

从C ++发送到VB时,我只需要保持“Т”不变。我知道VB字符串可以保存该字符,因为从VB中的另一个源我可以存储它(它显示为“?”,但具有正确的unicode十进制值)。

非常感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:1)

BSTR不是UTF-8,它是UTF-16,这是你用L""前缀得到的。取出UTF-8转换并使用CStringW。并使用LPCWSTR代替LPCTSTR