2011-09-27 72 views
4

我从注册表中获取值。该值可能包含双字节字符。 我稍后必须通过网络传输这个到一个C#客户端来显示。 C#都是unicode。 如果将该函数称为非Unicode,则该函数返回MBCS。unicode或不unicode

我应该使用什么?

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

string result = string(cbData); 
RegQueryValueExW(h_sub_key, L"DisplayName", NULL, NULL, (LPBYTE) &result[0], &cbData) 
+1

我会在下面的两个答案中添加RegQueryValueEx需要计算的字节数,而不是字符数,所以您还需要考虑这一点。 – tinman

+0

我还会说,作为构造函数的字符串(cbData)不会编译,如果你的cbData太长,那么即使它们是空字符(例如result.length() == cbData,即使RegQueryValueEx只复制6个字符),RegQueryValueEx也不会终止你的字符串,所以你需要在某处调整你的长度。所以,直到你修复它们,不要使用你发布的任何一行;) – tinman

回答

4

使用Unicode只要有可能会让你的生活更轻松。注册表本地包含Unicode,并在使用ReqQueryValueExA时即时转换为MBCS,为什么要执行不必要的转换?

从UTF-16转换为UTF-8可能对通过网络传递的信息有意义,但如果控制连接的两端,则不需要。

3

不,这不是它的工作方式。您从第一个片段获取的字符串根据当前系统代码页编码为。可能是双字节编码。可能是任何事情。当然,这个大问题是,该互联网连接另一端的C#代码无法猜测代码页可能是什么。

所以不要使用第一个片段。第二个让你得到utf16中的字符串,在Windows中使用的本地编码,结果需要是一个std :: wstring。也是C#使用的编码,所以你可以发送二进制字符串。尽管这通常不是一个好主意,但xml很受欢迎。您可以自行设置线路格式。