在javascript

时间:2018-06-01 13:40:28

标签: javascript windows registry

第一次在这里发帖!:)

正如标题所说,我有一个win reg fie(reg_sz),其中包含“name”和“value”

this.reg = new Registry.Key(Registry.windef.HKEY.HKEY_CURRENT_USER, 'Path\Path\Path', Registry.windef.KEY_ACCESS.KEY_READ);

funct read(this.reg){
var value;
var pushes = [];
            [   
                "food", 
                "veggy", 
                "etc", 
                "etc"].forEach(function(name) {
                try {
                    value = key.getValue(name);
                    entries.push({name: name, value: value});
                } catch (e) {
                }
            });
return pushes;
};

示例:"food"="apple"

我的代码正确读取,但我遇到了一个特殊字符的问题,例如“ä”

"food"="äpple"

我的代码读作�pple

我的问题是我应该使用什么样的解码/编码以及这个win注册表是什么,它们究竟使用了什么?它可以是原始的JS,如果不是,还有什么?我尝试使用decodeURI / encodeURI,但似乎它不是正确的方法(不知道他们正在使用什么编码以及我应该使用哪种解码)

TLDR:如何在win注册表中输入“äpple”,当用JS读取该文件时,获取相同的“äpple”而不是“ pple”

1 个答案:

答案 0 :(得分:0)

看起来你正在使用windows-registry-node。不幸的是,这是#44中的一个错误。记者说:

  

如果我返回原始缓冲区并使用iconv将“ISO-8859-1”转换为“UTF-8”,我会得到正确的字符

请注意,这是假定系统的当前代码页,但可能并不总是正确的。 (有可能告诉iconv检测并使用当前的代码页吗?)

确切问题出在registry.js

if (value.type === types.LPTSR) {
    // TODO not sure why buffer's utf8 parsing leaves in the unicode null
    // escape sequence. This is a work-around (at least on node 4.1)
    value = value.toString().replace('\u0000', '');
}

这里它使用RegQueryValueExA,这意味着将字符串作为当前的Windows代码页获取,而不是使用UTF-16的RegQueryValueExW。所以value是Node.JS Buffer,不包含UTF-8。然后代码调用Buffer.toString(),它默认采用UTF-8:

value.toString('utf16le');

所以这需要在windows-registry-node中修复。最好的修复方法可能是使用-W版本的函数和{{1}}

为UTF-16设置代码。