Прошло уже достаточно много времени, и я хоть убей не могу понять, как же правильно применять перевод кодировок.
ПРимер 1:
- Код: Выделить всё
if OpenDialog1.Execute then
begin
if FileExists(UTF8ToSys(OpenDialog1.FileName)) then
begin
s_fname := OpenDialog1.FileName;
d_fname := GetFileName(s_fname);
if CopyFile(s_fname, d_fname, true) then
begin
end
else ShowMessage('Файл ' + UTF8ToSys(d_fname) + ' не найден.');
end
else ShowMessage('Файл "' + UTF8ToSys(s_fname) + '" не найден.');
end;
Пример рабочий. Понятно, что при выводе ShowMessage нужно перевести строку из UTF8 (кодировка IDE) в Ansi (кодировка системы). Но почему при получении имени файла из OpenDialog мы используем ту же функцию, а не наоборот, SysToUTF8?
Пример 2:
В коде есть процедура загрузки bmp/jpeg:
- Код: Выделить всё
s_fname := OpenDialog1.FileName;
img_fname := GetFileName(s_fname);
img_ext := UTF8LowerCase(GetExt(img_fname));
full_fname := 'data\' + img_fname;
ApplyBMPPreview(UTF8ToSys(full_fname));
сама процедура такая:
- Код: Выделить всё
procedure ApplyBMPPreview(SFname: String);
var
//SourceImage
SI: Graphics.TBitmap;
begin
SI := Graphics.TBitmap.Create;
if FileExists(UTF8ToSys(SFname)) then SI.LoadFromFile(SFname)
else
begin
ShowMessage('Файл ' + UTF8ToSys(SFname) + ' не найден.');
SI.LoadFromFile('textures\std\img1.bmp');
Exit;
end;
и она работает именно в таком виде.
Получается, что мы для функции FileExists в данном случае ДВАЖДЫ применяем UTF8ToSys, а для SI.LoadFromFile - один раз. Функции требуют разных кодировок?
В других местах кода для FileExists было достаточно один раз применить UTF8ToSys. Чего я не понимаю?
Когда таких мест в коде много, становится реально трудно жить.
Прочитал соответствующую статью, но не очень помогло.