0

我的程序使用的 2 个字符串中的某些字符有问题。

字符串 #1 使用从 3rd 方应用程序获取数据的 VB 代码填充。字符串 #2 从同一个第 3 方应用程序中获取类似数据,但它使用 C++ dll 获取数据并将其发送到 VB。

数据中有一些奇怪的符号。

我不太了解编码和不同的字符集,但我会尽力解释它。

我将使用“Т”作为我的示例角色。

“Т”(注意这不是正常的大写字母 t)它是 unicode 十进制值 1058 http://www.unicodemap.org/details/0x0422/index.html

当此字符在运行时出现在 String #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 应用程序.. 之后字符串没有任何反应。

字符串 #1 只是一个普通的 VB 字符串

4

1 回答 1

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];
}
于 2013-01-30T08:41:28.530 回答