Значения Unicode в реестре (Inno Setup 5)

Мне нужно иметь возможность хранить определенные символы Unicode в нескольких ключах реестра, но я не могу найти синтаксис для этого в файле .iss. Я использую Unicode-версию Inno Setup.

На сайте Inno Setup говорится о значениях Unicode:

вы можете, например, вместо этого использовать закодированные символы Unicode для создания строк Unicode (например, S := #$0100 + #$0101 + 'Aa';), или загрузить строку из файла, используя LoadStringsFromFile, или использовать константу {cm:...}.

Например, один из тех, которые я хочу ввести, - это символ градусов по Фаренгейту (), который равен #$2109.

Я не могу поместить #$2109 непосредственно в строку значения, потому что это просто распечатывает этот текст. Я попытался создать константу #define, но она не распознает символы # и $.

Я хочу:

[Registry]
Root: HKLM; Subkey: "MyPath"; ValueType string; ValueName: "MyName; \
    ValueData: "Temperature [℉]"

но, очевидно, я не могу вставить это напрямую.

Как мне получить символы Unicode в разделе реестра напрямую или через некоторую переменную/константу, я довольно новичок в Inno Setup.

Заранее спасибо!


person LaG    schedule 02.05.2018    source источник


Ответы (2)


Просто убедитесь, что ваш файл .iss имеет кодировку UTF-8 с BOM.

Затем вы можете использовать строки UTF-8 непосредственно в нем (с версией Unicode Inno Setup), как документация говорит:

Unicode Inno Setup поддерживает файлы .iss в кодировке UTF-8 (но не UTF-16).

[Registry]
Root: HKLM; Subkey: "MyPath"; ValueType: string; ValueName: "MyName"; \
    ValueData: "Temperature [℉]"

(обратите внимание, что синтаксис ввода в вашем вопросе неверен, вам не хватает двоеточия и кавычки)

введите здесь описание изображения


Простой способ сохранить файл в UTF-8 с BOM:

  • Откройте файл .iss в графическом интерфейсе компилятора Inno Setup Compiler.
  • Выберите Файл > Сохранить кодировку и выберите UTF-8.
  • Сохраните файл.

Это нужно сделать перед вставкой строки UTF-8. Также обратите внимание, что редактор Inno Setup Compiler не может отображать , но при компиляции он все равно будет работать нормально.


Другой способ:

  • Откройте файл .iss в Блокноте Windows.
  • Выберите Файл > Сохранить как.
  • Выберите UTF-8 в раскрывающемся списке Кодировка.
  • Нажмите Сохранить.

Блокнот Windows может отображать (с соответствующим шрифтом, например Consolas по умолчанию или Lucida Console).

person Martin Prikryl    schedule 03.05.2018
comment
Ваш ответ — лишь часть моего. Вы копируете строку в ValueData: "Temperature [℉]" ! И я делаю то же самое, только я получил в .iss заполнитель, например ValueData: "Temperature [=]" или ?. После компиляции и запуска в реестр пишется одно и то же содержимое. - person moskito-x; 03.05.2018
comment
Может быть, я неправильно понимаю ваш ответ. Вы говорите изменить кодировку в Notepad++, а затем Далее мы используем константу и функцию. Мне показалось, что вам нужно сделать и то, и другое. Но, может быть, вы на самом деле имеете в виду, что второе — это альтернативное решение. Но не ясно имхо. - person Martin Prikryl; 03.05.2018

Простой способ - написать то, что вам нужно, в Notepad ++, например. : Температура + (ALT+2109) //

введите здесь описание изображения

  • Установите кодировку в UTF-8 без спецификации.
  • выделите всю строку и (Ctrl+C) скопируйте
  • вставьте в ValueData скопированную строку "Temperature [?]"

[Registry]
Root: ... ValueType: string; ValueName: "AString"; ValueData: "Temperature [?]"

Это все



В другом решении мы используем константу и функцию:

FHcnst1 =  #$2109#$20#$54#$65#$6D#$70; // ℉ Temp

и суммируем (℉ Temperature Const)

℉ Температура
Постоянная

... ValueType: string; ValueName: "AConst"; ValueData: "{code:SetTemperature|1}erature Const"

Функция "SetTemperature"

[Code]
var
  UserPage: TInputQueryWizardPage;
  UsagePage: TInputOptionWizardPage;
  DataDirPage: TInputDirWizardPage;
const
  FHcnst1     = #$2109#$20#$54#$65#$6D#$70; // ℉ Temp
  FHcnst2     = #$2109#$20;
...
function SetTemperature(Param: String): String;
begin 
    if Param = '1' then Result := FHcnst1;
    if Param = '2' then Result := FHcnst2;
end;

Результат:

введите здесь описание изображения

Хак:
Вы должны записать в реестр три байта. Только Unicode #$2109 не будет работать.

Хороший — это место за 20 долларов (потому что оно невидимое).

FHcnst2     = #$2109#$20;
person moskito-x    schedule 03.05.2018
comment
Что такое излишество? Скопируйте и вставьте, как вы это делаете, скомпилируйте и запустите, и ℉ появится в реестре. Это все !! Не вижу перебора!! - person moskito-x; 03.05.2018
comment
Как я объяснил в своем ответе на ваш комментарий к моему ответу, я, возможно, неправильно понял ваш ответ. Его формулировка была неясной, имхо. Но это мог быть только я. Я удалил комментарий, так как вы отредактировали свой ответ сейчас. - person Martin Prikryl; 03.05.2018
comment
Я отредактировал свой ответ только с помощью Another solution и That's all. ИМО, вы читаете это быстро. :) . Ваша дополнительная информация может быть описана в комментарии одной строкой. Just make sure your .iss file has UTF-8 BOM.Then you can use UTF-8 strings directly in it (with Unicode version of Inno Setup), as the documentation says: - person moskito-x; 03.05.2018
comment
Эта строка на самом деле является ключом. Ваш ответ на самом деле неверен, как вы помогли мне понять своим последним комментарием. Файл должен иметь спецификацию, иначе компилятор Inno Setup интерпретирует файл как закодированный в ANSI. Ваш ответ показывает, что следует выбрать спецификацию UTF-8 ohne (UTF-8 без спецификации). И это неправильно! Вот что я получаю без вашего решения: i.stack.imgur.com/qDaAk.png - я в курсе, что вы на самом деле не сохраняете файл, а копируете его содержимое в .iss - но вы даже не упоминаете, как должен сохраняться .iss (ни кодировки, пусть только BOM). - person Martin Prikryl; 03.05.2018
comment
Для копирования и вставки лучше не открывать файл со спецификацией. Случайно также могут быть скопированы три байта заголовка спецификации. Это просто безопаснее ! Ни в коем случае нельзя ошибаться. - person moskito-x; 03.05.2018
comment
1) Спецификация не является частью текста в редакторе, поэтому ее нельзя скопировать в буфер обмена. Это могло произойти только в том случае, если вы открыли файл в кодировке UTF-8 со спецификацией в кодировке ANSI. Но это не то, что вы делаете. 2) Еще раз, в вашем ответе даже не упоминается, как должен быть закодирован файл .iss. Так что на самом деле это не ответ на вопрос. -- Это мой последний комментарий. Пусть ОП решает. - person Martin Prikryl; 03.05.2018
comment
Обычной практикой является улучшение ответа с помощью комментария в StackOverflow. Я бы учел ваш комментарий в своем ответе. 2) Once again, your answer does not even mention how the .iss file should be encoded. Должен, но не должен. Вопрос ОП явно не закодирован !! Большое спасибо за указание на это. Но под моим ответом достаточно места, чтобы улучшить его комментарием. - person moskito-x; 03.05.2018
comment
Я попытался использовать функцию, очень похожую на вашу, за исключением того, что константы были просто символами Unicode, которые мне нужны, но я объединил их со строкой в ​​​​разделе реестра. У меня тоже не было раздела var, что он делает и нужно ли использовать функцию вне раздела кода? Виеле Данк, за вашу помощь. - person LaG; 03.05.2018
comment
@LaG, мой раздел Var - это просто остаток моего кода. Вам не нужен раздел Var. В моем ответе есть function SetTemperature с командой: ...ValueData: "{code:SetTemperature|1}erature Const {code:SetTemperature|2}"вы получите: ℉ Temperature Const ℉. - person moskito-x; 03.05.2018
comment
--›и нужно ли использовать функцию вне раздела кода?‹-- функция SetTemperature() находится в разделе [код]!! - person moskito-x; 03.05.2018