'新2' 采用 utf-8 编码存储到注册表后再读取出来,就吵是 '新2',也许与 注册表使用 Unicode 存储有关?

问题描述:

exe程序,内部使用的编码:gbk

gbk:'新2'
0xd0 0xc2 0x32

转utf-8:'鏂?'
长度:4
0xe6 0x96 0xb0 0x32
存储到注册表(REG_SZ)...

从注册表读取数据:
utf-8:'鏂?'
len-utf8:4
0xe6 0x96 0x3f 0x0

为什么将一个含中文的字符串,由原来gbk编码转换成utf-8编码后,存储到注册表(REG_SZ),然后再读出来的时候,数据就不对了呢,0x3f 什么情况?

我尝试过,存储到 REG_BINARY 类型的注册表项中,数据不会被改写。

但因为一些原因,字符串必须要由原来的gbk转换成utf-8编码,并且必须存储在REG_SZ类型的注册表项中。

--------------------------------------------------------------------------------------------------------------------------------------------

最近看到网上有一段关于注册表的描述:

如果 dwType 是 REG_SZ、REG_MULTI U SZ 或 REG _EXPAND _SZ 类型,
并且使用了此函数的ANSI版本(通过显式调用 RegSetValueExA 或在包含 Windows.h 文件之前不定义 UNICODE),
则 lpData 参数指向的数据必须是 ANSI 字符串。字符串在存储到注册表中之前将转换为 Unicode。

--------------------------------------------------------------------------------------------------------------------------------------------

如果用 RegSetValueExW 来存储,是否可以解决上述问题呢?

有空试一下

原文地址:https://www.cnblogs.com/personnel/p/14288233.html