JavaScript读取Windows注册表Reg_SZ特殊字符乱码问题求助
解决Windows注册表Reg_SZ项特殊字符乱码问题
我来帮你搞定这个注册表特殊字符读取乱码的问题!
先搞懂Windows注册表的编码
首先你要明确:Windows里的Reg_SZ类型项,底层是用**UTF-16LE(小端序Unicode)**编码存储的。你遇到的乱码,本质是读取代码把这个双字节编码当成了单字节编码(比如UTF-8、Latin1)来解析,导致多字节的特殊字符(比如“ä”)被拆错,出现�这种替换字符。
原生JS解决方法
你之前用decodeURI/encodeURI没用很正常——那俩是处理URL编码的,和注册表的UTF-16LE编码完全不搭边。我们需要把读错的乱码字符串还原成原始字节,再用正确的编码解码。
核心修复函数
先写一个原生JS函数,专门修复这种编码错误的字符串:
function fixRegistryEncodedString(mangledStr) { // 第一步:把乱码字符串转成原始字节数组(用Latin1编码保留每个字节的原始值) const latin1Encoder = new TextEncoder("latin1"); const rawBytes = latin1Encoder.encode(mangledStr); // 第二步:用UTF-16LE解码原始字节,得到正确字符串 const utf16Decoder = new TextDecoder("utf-16le"); return utf16Decoder.decode(rawBytes); }
整合到你的代码里
我还修正了你代码里的几个小问题(变量名混淆、参数引用错误):
this.reg = new Registry.Key(Registry.windef.HKEY.HKEY_CURRENT_USER, 'Path\\Path\\Path', Registry.windef.KEY_ACCESS.KEY_READ); function read(reg){ const entries = []; ["food", "veggy", "etc", "etc"].forEach(function(name) { try { // 读取到的乱码值 const mangledValue = reg.getValue(name); // 修复编码 const correctValue = fixRegistryEncodedString(mangledValue); entries.push({name: name, value: correctValue}); } catch (e) { console.error(`读取项 ${name} 失败:`, e); } }); return entries; };
为什么这个方法有效?
当你的注册表读取库把UTF-16LE的字节当成单字节编码解析时,会把每个字节单独转成字符(比如“ä”的UTF-16LE是0xE4 0x00,被当成Latin1读就会变成“ä”+空字符)。我们用TextEncoder("latin1")把乱码字符串转回去,就能拿到注册表存储的原始字节,再用TextDecoder("utf-16le")解码,就得到了正确的“äpple”。
内容的提问来源于stack exchange,提问作者Darknjan994
相关产品推荐
相关产品推荐

