我的程序使用的2个字符串中的某些字符出现问题。
使用从第三方应用程序获取数据的VB代码填充字符串#1。 字符串#2从相同的第三方应用程序获取类似的数据,但它使用C ++ DLL获取它并将其发送到VB。
数据中有一些奇怪的符号。
我不太了解编码和不同的字符集,但我会尽力解释它。
我将使用“Т”作为我的示例角色。
“Т”(注意这不是正常的大写t)它是unicode十进制值1058 http://www.unicodemap.org/details/0x0422/index.html
当这个字符在字符串#1中出现在运行时它显示为“?”,我相信这正是VB6显示的一些unicode字符。当我在字符上使用AscW时,它返回正确的值1058。
当我将字符串输出到文本文件时,它显示为“?”。
C ++ DLL中字符串#2中的相同字符显示为2个字符“Т”
当我将该字符串输出到文本文件时,该字符正确显示为“Т”。
我只是将文本文件输出到测试目的。我只需要在运行时编码/显示相同的2个字符串。
有什么想法在这里发生?我有什么方法可以让奇怪的字符在两个字符串中看起来都一样吗?
由于
编辑:C ++ dll也是多字符集,并以BSTR字符串
发送数据C ++ DLL中的代码
allChat是CString
BSTR Message;
int len = allChat.GetLength();
Message = SysAllocStringByteLen ((LPCTSTR)allChat,len+1);
消息返回到VB应用程序..之后字符串没有任何反应。
String#1只是一个普通的VB字符串
答案 0 :(得分:3)
从西里尔语“T”成为“Т”的方式,你得到你的字符串作为UTF8编码的字符串(我通过切换编码验证了Notepad ++)。在将其发送到VB应用程序之前,您需要将其转换为Unicode。请注意,您的VB应用程序需要是Unicode,而不是ASCII。
您可以使用此函数将UTF8转换为std :: wstring:
std::wstring utf8to16( const char* src )
{
vector<wchar_t> buffer;
buffer.resize(MultiByteToWideChar(CP_UTF8, 0, src, -1, 0, 0));
MultiByteToWideChar(CP_UTF8, 0, src, -1, &buffer[0], buffer.size());
return &buffer[0];
}