【问题标题】:String encoding VB6 / C++ dll字符串编码 VB6/C++ dll
【发布时间】:2013-01-13 22:24:36
【问题描述】:

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

字符串 #1 使用从第 3 方应用程序获取数据的 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 应用程序.. 之后字符串没有任何反应。

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

【问题讨论】:

  • 这听起来像你在 C++ 中得到的 UTF8
  • 你能扩展一下吗?从 C++ dll 填充的字符串听起来像 UTF8 吗?如果是这样,我应该弄清楚如何在 VB 中转换一次,还是应该在 C++ dll 发送数据之前做一些事情?
  • 显示一些代码,你的 c++ 字符串的类型是什么
  • C++ 数据最初是在 CString 中,它在被发送到 VB 之前被转换为 BSTR,如下所示:将代码添加到 OP
  • 显示一些代码,在此之前我无法回答

标签: c++ vb6


【解决方案1】:

从西里尔字母“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];
}

【讨论】:

  • 感谢 satuon,我认为这些信息足以让我朝着正确的方向前进 :)
  • 可以使用MultiByteToWideChar进行转换,看我的编辑
  • 非常感谢!直到明天我才有机会尝试,所以我现在就接受你的回答:)。我很确定如果我有任何问题,无论如何我都可以从这里拿走。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 2013-10-31
相关资源
最近更新 更多