字符串编码VB6 / C ++ dll

时间:2013-01-30 06:57:38

标签: c++ vb6

我的程序使用的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字符串

1 个答案:

答案 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];
}