Я пишу приложение с Lazarus (1.5) fpc (3.1.1) для Windows XP/7/10. Мое приложение читает и записывает файлы в файловой системе по пути, выбранному пользователями. Если путь или имя файла содержат специальные символы (например, à è é), например:
C:\Users\ДеАндре\out.txt
Приложение вызывает исключение:
'EFCreateError' Невозможно создать файл "C:\Users\DeAndrè\out.txt".
Можно воспроизвести эту проблему, написав простое приложение с простой формой: перетащите в форму TListBox (ListBox1), два TButton (Button1 и Button2) и TSaveDialog (SaveDialog1).
В событии OnClick для Button1 (используется только для записи некоторых данных в ListBox1):
procedure TForm1.Button1Click(Sender: TObject);
begin
// Simple Add Hello to ListBox
ListBox1.Items.Add('Hello '+IntToStr(ListBox1.Items.Count));
end;
В событии OnClick Button2:
procedure TForm1.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
ListBox1.Items.SaveToFile(SaveDialog1.FileName);
end;
end;
Запустите приложение и нажмите кнопку «Button1» несколько раз (просто чтобы добавить несколько слов в список), затем нажмите кнопку «Button2» и попробуйте сохранить содержимое по пути, содержащему специальные символы...
Я заметил, что если я конвертирую FileName с помощью функции UTF8ToAnsi, это работает, но почему? Файловая система Windows не является UTF8?
Есть "стандартное" решение? например, настроить приложение для использования файловой системы в правильном режиме или аналогичном?
Спасибо
EnableUTF8RTL
, спасибо @Rudy и @David - person AndreaBoc   schedule 17.05.2017