You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:04:45