Просмотр темы форума
Тема: Поддержка unicode
Пользуемся версией 5.16.0.
Возникла потребность использовать юникод при создании установки. В файле russian.lng прописано: <data name = Russian native = "Русский" cp=1251/>. Можно ли изменить кодовую страницу на utf-16 или надо полностью менять russian.lng?
К сожалению, поддержки Unicode в инсталляциях созданных CreateInstall нет.
Все .lng файлы и так находятся в UTF-8. Сам CreateInstall поддерживает Unicode, но создаваемые установки нет. Кодовые страницы для того и указываются, чтобы конвертировать из Unicode в нужную кодировку.
Понятно, что по этой причине, например, русские буквы на немецкой Windows выглядят крякозябрами или наборот например файл с немецким именем на русской Windows сохранится под другим именем.
Вот проблема как раз в том, что в нерусскоязычной Windows отображается инсталлятор как попало.
Спасибо за консультацию.
Мы прекрасно понимаем, что нужен переход на Unicode. Но так как там потребуется переписывать достаточно много, поэтому эта работа все откладывается. Может в этом году что-то получится сделать.
А можно ли что-то сделать, чтобы хотя бы имена файлов записывались при установке не кракозябрами?
То есть, если у нас в списке инсталляции есть имя файла «Тестовый звонок.cfg», он записывается на англоязычном компьютере как «Òåñòîâûé çâîíîê.cfg». Это можно как-то исправить?
В общем случае, на данный момент, ничего сделать нельзя.
Если файлов с русскими именами не так много, то можно попробовать переименовать их в процессе установки с помощью юникодной функции.
А каким образом можно это сделать? Если функция будет в установочном пакете, то она тоже будет не юникодная. А .bat-файлы в юникоде не запускаются.
Можно написать свою функцию переименования файлов, которая будет использовать не MoveFileA, а MoveFileW из Windows API.
Использовать одновременно Unicode и не Unicode функции можно.
Единственно, что придется указывать при вызове новое имя в UTF-8.
Типа вот такой вызов должен быть
urename("#setuppath#\\Тестовый звонок.cfg", "#setuppath#\\Тестовый Р·РІРѕРЅРѕРє.cfg" )
Если устраивает, то за сегодня-завтра постараемся реализовать.
Вставьте команду Исходный код (Source Code) в начале скрипта установки и укажите там
import "kernel32.dll" {
uint MoveFileW( uint, uint )
}
func uint urename( str src, str dest )
{
ustr usrc udest
usrc = ustr( macrox_do( src ))
udest.fromutf8( macrox_do( dest ))
return MoveFileW( usrc.ptr(), udest.ptr() )
}
Отметьте галочку External Source Code
Далее после распаковки ваших файлов вставьте тоже команду Source Code с примерно таким вызовом
urename("#setuppath#\\Тестовый звонок.cfg", "#setuppath#\\Тестовый Р·РІРѕРЅРѕРє.cfg" )
Огромное спасибо! Действительно помогло.
Немного неудобно конвертировать все необходимые имена файлов вручную, но корректное отображение того стоит.
Если вдруг кому-то понадобится, пишем имена файлов в UTF-8, потом смотрим в 1251, чтобы получить из «Тестовый звонок» «РўРµСЃС‚овый Р·РІРѕРЅРѕРє».
Дополнительно:
При замене большого количества текста вызывает неудобство неизменяемый размер окна для ввода кода. Даже при разворачивании окна программы на весь экран поле ввода кода остаётся того же размера, что и было.
Имеется в виду изменение по высоте? По ширине поле ввода должно растягиваться.
Если исходного кода много, то его проще вынести в отдельный файл и редактировать в любом текстовом редакторе.
В данном случае можно создать файл myfile.g и сохранить его туда же где находится ваш .ci файл проекта, в файле создать функцию
func myfunc
{
// Сюда перенести ваш код
}
Далее, в команде где у вас описана urename добавить
include : $"$prjpath$\myfile.g"
А в другой команде Исходный код вместо вашего кода написать
myfunc()
Появился вопрос. Какой можно добавить код, чтобы переименование файлов безусловно (или с запросом) заменяло уже существующий файл.
К примеру, я устанавливаю программу, у меня есть в папке предыдущая версия, в которой наличествует файл с именем «Пример.txt». Я переименовываю «РџСЂРёРјРµСЂ.txt», созданный инсталлятором, в «Пример.txt», но переименования не происходит, потому что файл уже существует.
Нужно преварительно удалить с помощью команды Delete Files & Folders ну или из Исходного кода
deletefile( macrox_do( "#setuppath#\\Тестовый звонок.cfg" )).
Или вам нужна аналогичная функция удаления которая работает с utf8 как urename?
16.01.25 Выпущен инсталлятор CreateInstall 8.11.1.
19.06.24 Выпущен инсталлятор CreateInstall 8.11.0. подробнее
13.11.22 Выпущен инсталлятор CreateInstall 8.10.1.
21.05.22 Выпущен инсталлятор CreateInstall 8.10.0.
25.09.21 Выпущен инсталлятор CreateInstall 8.9.0.
15.07.21 Выпущен инсталлятор CreateInstall 8.8.1.