在托管的C ++

时间:2018-08-07 01:50:51

标签: c# character-encoding managed-c++ chinese-locale

我有一个名为CTP的公司的dll,该文件使我可以在中国交易所进行交易。它在C ++中,我的应用程序在C#中。我已经能够编写代码,使用托管C ++链接到dll,并将字符串(ascii)和其他参数从C#转换为dll。唯一的问题是,当我从dll中获取错误消息时,它们是中文。而且我无法将char *转换为包含有效中文字符的有效String ^。

例如,以下char *消息数组:

43 54 50 3A CE DE B4 CB C8 A8 CF DE 00

使用此代码:

return gcnew String^(message);

我得到“ CTP:ÎÞ´ËȨÏÞ”。

使用此代码:

int bufSize = MultiByteToWideChar(CP_UTF8, 0, message, -1, NULL, 0);
wchar_t* wstr = new wchar_t[bufSize];
MultiByteToWideChar(CP_UTF8, 0, message, -1, wstr, bufSize);
String^ val = gcnew String(wstr);
delete[] wstr;
return val;

我收到“ CTP:”。

此外,当我尝试通过在线十六进制运行该文本字符串-> UTF8转换器时,我收到一条错误消息,指出utf8字符串无效。

我非常确定前四个字符是“ CTP:”,因为这是编写dll的公司的名称。

但是,我不知道后面的汉字是如何编码的。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好吧...所以编码为GB18030或“代码页” 54936 ...因此以下代码正确转换了字符串。不知道是否有针对GB18030的#define。

System::String^ CTPTraderWrapper::GetString(char* message)
{
    int bufSize = MultiByteToWideChar(54936, 0, message, -1, NULL, 0);
    wchar_t* wstr = new wchar_t[bufSize];
    MultiByteToWideChar(54936, 0, message, -1, wstr, bufSize);
    String^ val = gcnew String(wstr);
    delete[] wstr;
    return val;
}