C++ 是否转换为unicode

C++ 是否转换为unicode,c++,winapi,C++,Winapi,我正在从注册表中获取一个值。此值中可能包含双字节字符。 稍后我必须通过网络将其传输到C#客户机以显示。C#全是unicode。 如果您将其称为非unicode,则该函数将返回MBCS 我应该用什么 string result = string(cbData); RegQueryValueExA(h_sub_key, "DisplayName", NULL, NULL, (LPBYTE) &result[0], &cbData) 或 尽可能使用Unicode将使您的生活更轻松。注

我正在从注册表中获取一个值。此值中可能包含双字节字符。 稍后我必须通过网络将其传输到C#客户机以显示。C#全是unicode。 如果您将其称为非unicode,则该函数将返回MBCS

我应该用什么

string result = string(cbData);
RegQueryValueExA(h_sub_key, "DisplayName", NULL, NULL, (LPBYTE) &result[0], &cbData)


尽可能使用Unicode将使您的生活更轻松。注册表本机包含Unicode,并在使用ReqQueryValueExA时动态转换为MBCS,为什么要进行不必要的转换


从UTF-16转换为UTF-8可能对通过网络传输的信息有意义,但如果您控制连接的两端,就没有必要了。

不,这不是它的工作方式。从第一个代码段返回的字符串将根据当前系统代码页进行编码。可能是双字节编码。可能是任何东西。当然,最大的问题是,互联网连接另一端的C#代码无法猜测代码页可能是什么


所以不要使用第一个代码段。第二个命令获取utf16中的字符串,utf16是Windows中使用的本机编码,结果需要是std::wstring。还有C#使用的编码,因此可以发送二进制字符串。虽然这通常不是一个好主意,但xml很流行。由您来设置wire格式。

我想在下面的两个答案中添加一点,即RegQueryValueEx计算的是字节数,而不是字符数,因此您也需要考虑到这一点。我还想说,作为构造函数的字符串(cbData)不会编译,如果您的cbData太长,那么即使它们是空字符(例如,result.length()==cbData,即使RegQueryValueEx仅复制6个字符),您也会在缓冲区中保留剩余的字符,并且RegQueryValueEx也不会空终止字符串,因此您也需要在某个位置调整长度。所以,在修复它们之前,不要使用您发布的任何一行;)
string result = string(cbData);
RegQueryValueExW(h_sub_key, L"DisplayName", NULL, NULL, (LPBYTE) &result[0], &cbData)