第一次在这里发帖!:)
正如标题所说,我有一个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”
答案 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设置代码。