Вопрос Преобразование файла в UTF-8

jason

Мимокрокодил
Здравствуйте.
Имеется файл File.xml в кодировке UTF-8:
http://www44.zippyshare.com/v/vc3aoAmN/file.html


Необходимо чтобы при установке в нем был прописан путь до документов пользователя {userdocs}
Но после изменения и сохранения файла он записывается в неправильной кодировке (ansi или cp1251):
http://www76.zippyshare.com/v/SK9o52AR/file.html


А должно быть так:
http://www26.zippyshare.com/v/CkhXcdE7/file.html


Вопрос:
Как можно сохранить файл в кодировке UTF-8 средствами Inno Setup?

В Notepad++ это делается вручную:
Кодировки -> Кодировка Ansi
Кодировки -> Преобразовать в UTF-8

Код программы:
Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: "File.xml"; DestDir: "{app}\Files"; Flags: ignoreversion;

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  UnicodeStr: string;
  ANSIStr: AnsiString;
begin
  if (CurStep = ssPostInstall) then
  begin
  LoadStringFromFile(ExpandConstant('{app}\Files\File.xml'), ANSIStr)
  UnicodeStr := String(ANSIStr);
  StringChangeEx(UnicodeStr, 'UserDocsPath', ExpandConstant('{userdocs}'), False)
  SaveStringToFile(ExpandConstant('{app}\Files\File.xml'), AnsiString(UnicodeStr), False);
  end;
end;
- Утилиту win-iconv http://www.cyberforum.ru/post4854353.html
Результат (iconv -f windows-1251 -t utf8 file.xml > file1.xml) :
http://www114.zippyshare.com/v/7RWqkHJx/file.html


- Функцию AnsiToUtf8 из скрипта для Freearc http://forum.ru-board.com/topic.cgi?forum=5&topic=30413&start=1646&limit=1&m=1
Результат SaveStringToFile(ExpandConstant('{app}\Files\File.xml'), AnsiToUtf8(AnsiString(UnicodeStr)), False) :
http://www34.zippyshare.com/v/0xVh7l0G/file.html

Буду признателен за помощь!
 
Последнее редактирование:

jason

Мимокрокодил
Хамик, спасибо за оперативность. Но при компиляции выдает ошибку "typemismatch",
Код:
SaveStringsToUTF8File(ExpandConstant('{app}\Files\File.xml'), AnsiString(UnicodeStr), False);
 
Последнее редактирование:

Хамик

Старожил
jason,
Не проверял, но по идеи должно работать.
Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: "File.xml"; DestDir: "{app}\Files"; Flags: ignoreversion;

[code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  UnicodeStr: string;
  ANSIStr: AnsiString;
  Str: TArrayOfString;
begin
  if (CurStep = ssPostInstall) then
  begin
  LoadStringFromFile(ExpandConstant('{app}\Files\File.xml'), ANSIStr);
  UnicodeStr := String(ANSIStr);
  StringChangeEx(UnicodeStr, 'UserDocsPath', ExpandConstant('{userdocs}'), False);
  SaveStringToFile(ExpandConstant('{app}\Files\File.xml'), AnsiString(UnicodeStr), False);
  LoadStringsFromFile(ExpandConstant('{app}\Files\File.xml'), Str);
  SaveStringsToUTF8File(ExpandConstant('{app}\Files\File.xml'), Str, False);
  end;
end;
 

Avengerz13

Участник
jason, скачайте и попробуйте. У меня файл создается в UTF-8.
 

Вложения

Последнее редактирование:

jason

Мимокрокодил
Avengerz13, спасибо за пример! После декомпиляции в ресурсах нашел файл File.xml в Ansi кодировке.
Я у себя так же сделал - предварительно преобразовал исходные файлы из UTF8 в Ansi, после чего инсталлятор их стал обрабатывать корректно

Премного благодарен за помощь, теперь все работает!

Нашел еще один рабочий способ(с небольшим багом) который подходит для исходных файлов в UTF8
http://stackoverflow.com/questions/...e-without-bom-with-inno-setup-unicode-version
 
Последнее редактирование:

Хамик

Старожил
jason, проверил ваш начальный код, оказывается все нормально прописывается. Использую ansi версию компилятора.

а не проще использовать модуль по работе с XML файлами?
Код:
#include "XML.iss"

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: "File.xml"; DestDir: "{app}\Files"; Flags: ignoreversion;

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if (CurStep = ssPostInstall) then
  begin
     XMLFileWriteValue(ExpandConstant('{app}\Files\File.xml'), 'Settings\DocFiles', '', ExpandConstant('{userdocs}'), False);
  end;
end;
 
Последнее редактирование:
Сверху