Unicode стойности в системния регистър (Inno Setup 5)

Трябва да мога да съхранявам определени Unicode символи в няколко от ключовете на системния регистър, но не мога да намеря синтаксиса, за да направя това в .iss файл. Използвам Unicode версията на Inno Setup

Сайтът за настройка на Inno казва това за 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 поддържа UTF-8 кодирани .iss файлове (но не и UTF-16).

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

(обърнете внимание, че синтаксисът на въвеждане във вашия въпрос е грешен, липсва ви двоеточие и кавичка)

въведете описание на изображението тук


Лесен начин за запазване на файла в UTF-8 с BOM:

  • Отворете файла .iss в GUI на Inno Setup Compiler.
  • Отидете на Файл > Запазване на кодирането и изберете UTF-8.
  • Запазете файла.

Трябва да направите това преди да вмъкнете своя UTF-8 низ. Също така имайте предвид, че редакторът на Inno Setup Compiler не може да покаже , но все пак ще работи добре, когато се компилира.


Друг начин е:

  • Отворете файла .iss в Windows Notepad.
  • Отидете на Файл > Запиши като.
  • Изберете UTF-8 в падащото поле Кодиране.
  • Кликнете върху Запазване.

Windows Notepad може да показва (с подходящ шрифт, като стандартния Consolas или Lucida Console).

person Martin Prikryl    schedule 03.05.2018
comment
Вашият отговор е само част от моя. Копирате реда в ValueData: "Temperature [℉]"! И аз правя същото, само че имам в .iss заместител като ValueData: "Temperature [=]" или ?. След компилиране и стартиране В регистъра е написано същото съдържание. - person moskito-x; 03.05.2018
comment
Може би не съм разбрал отговора ви. Казвате промяна на кодирането в Notepad++ и след това След това използваме константа и функция. Звучеше ми сякаш трябва да правиш и двете. Но може би всъщност имате предвид, че второто е алтернативно решение. Но не е ясно imo. - person Martin Prikryl; 03.05.2018

Лесен начин е да напишете това, от което се нуждаете, в Notepad++, напр. : Температура + (ALT+2109) //

въведете описание на изображението тук

  • Задайте кодирането на UTF-8 без BOM
  • изберете целия ред и (Ctrl+C) копирайте
  • поставете в ValueData копирания ред "Temperature [?]"

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

Това е всичко



Друго решение използваме константа и функция:

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

и събираме (℉ Температурна константа)

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

... 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
Както обясних в отговора си на вашия коментар към моя отговор, може да съм разбрал погрешно отговора ви. Формулировката му беше неясна, imo. Но може да съм само аз. Премахнах коментара, тъй като сега сте редактирали отговора си. - person Martin Prikryl; 03.05.2018
comment
Редактирах отговора си само с Another solution и That's all. IMO го четете бързо. :) . Вашата допълнителна информация може да бъде описана в коментар с един ред. 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
Този ред всъщност е ключът. Вашият отговор е всъщност грешен, както ми помогнахте да разбера с последния си коментар. Файлът трябва да има BOM, в противен случай компилаторът на Inno Setup ще интерпретира файла като ANSI-кодиран. Вашият отговор показва, че трябва да изберете UTF-8 ohne BOM (UTF-8 без BOM). И това е грешно! Ето какво получавам без вашето решение: i.stack.imgur.com/qDaAk.png - Наясно съм, че всъщност не записвате файла, а копирате съдържанието му в .iss - но дори не споменавате как трябва да се запази .iss (нито кодирането, нека само BOM). - person Martin Prikryl; 03.05.2018
comment
За копиране и поставяне е по-добре да не сте отваряли файл с BOM. Случайно трите заглавни байта на BOM също могат да бъдат копирани. Просто е по-безопасно! В никакъв случай не е грешно. - person moskito-x; 03.05.2018
comment
1) BOM не е част от текста в редактора, така че не може да бъде копиран в клипборда. Това може да се случи само ако отворите UTF-8 кодиран файл с BOM като 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. Трябва, но не трябва. Въпросът на OP очевидно не е кодиран !! Това е голямо благодаря, че го подчертахте. Но под моя отговор има достатъчно място да го подобря с коментар. - person moskito-x; 03.05.2018
comment
Опитах се да използвам функция, много подобна на вашата, с изключение на това, че константите бяха само символите на Unicode, които исках, но ги комбинирах с низ в секцията на системния регистър. Аз също нямах секцията var, какво прави това и необходимо ли е да използвам функцията извън секцията с код? Viele Dank, за вашето съдействие. - 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