Чтение реестра Windows Reg_SZ в JavaScript - PullRequest
0 голосов
/ 01 июня 2018

здесь впервые! :))

Как видно из заголовка, у меня есть 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: как я могу набрать «äpple» в реестре win и когдачитая этот файл с помощью JS, вы получите тот же «äpple» вместо «�pple»

1 Ответ

0 голосов
/ 01 июня 2018

Похоже, вы используете windows-registry-node .Это, к сожалению, ошибка в том, # 44 .Репортер говорит:

Если я возвращаю необработанный буфер и использую iconv для преобразования из "ISO-8859-1" в "UTF-8", я получаю правильные символы

Обратите внимание, что это предполагает текущую кодовую страницу системы, и может не всегда быть корректной.(Возможно, можно сказать, что iconv обнаружит и использует текущую кодовую страницу?)

Точная проблема в registry.js :

// READ VALUE
result = advApi.RegQueryValueExA(key.handle.deref(), valueName, null, pKeyType, value,
                                 pKeyDataLength);

Вот оноиспользует RegQueryValueExA, что означает выборку строк в качестве текущей кодовой страницы Windows, в отличие от RegQueryValueExW, которая будет использовать UTF-16.Таким образом, значение, которое является буфером Node.JS, не содержит UTF-8.Затем код вызывает Buffer.toString (), который по умолчанию принимает UTF-8:

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', '');
}

Так что это нужно исправить в windows-registry-node.Лучшее решение - это, вероятно, установить код для UTF-16, используя версию -W функции и value.toString('utf16le');

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...