есть компонент TSdfDataSet , но файл подключается к нему в зависимости от пользоваетеля зашедшего в систему Windows , вычисляется папка профиля и далее там будет лежать файл,
cfgD.FileName:=Application.EnvironmentVariable['userprofile']+'\file.ini';
все хорошо пока папки профилей пользователей англоязычные а при рускоязычных он ругается что файл такой то не найден и пишет заместо руского имени абракадабру,(версия лазаруса 0.9.27 мартовская) понимаю что надо сделать преобразование но не пойму какое AnsiToUTF8 не помогло в какой кодировке нужен TSdfDataSet имя файла я так понимаю имя файла которое выплевывает EnvironmentVariable['userprofile'] анси...
кто знает как это бороть?
Заблудился с кодировкой
Модератор: Модераторы
Система Windows работает либо с ANSI кодировкой, либо с Unicode. Lazarus работает с кодировкой UTF-8. Отсюда логический вывод - надо системную кодировку преобразовать в UTF-8 :
SysToUTF8(Путь_и_имя_файла);
Это можно делать для всех путей, т.к. функция SysToUTF8() достаточно интеллектуальная и если преобразование ненужно, она его не делает.
На тот случай, если что-то посылается в систему, то наоборот:
UTF8ToSys()
чтобы система поняла, с каким файлом она будет работать.
SysToUTF8(Путь_и_имя_файла);
Это можно делать для всех путей, т.к. функция SysToUTF8() достаточно интеллектуальная и если преобразование ненужно, она его не делает.
На тот случай, если что-то посылается в систему, то наоборот:
UTF8ToSys()
чтобы система поняла, с каким файлом она будет работать.
Vadim писал(а):Система Windows работает либо с ANSI кодировкой, либо с Unicode. Lazarus работает с кодировкой UTF-8. Отсюда логический вывод - надо системную кодировку преобразовать в UTF-8 :
SysToUTF8(Путь_и_имя_файла);
Это можно делать для всех путей, т.к. функция SysToUTF8() достаточно интеллектуальная и если преобразование ненужно, она его не делает.
На тот случай, если что-то посылается в систему, то наоборот:
UTF8ToSys()
чтобы система поняла, с каким файлом она будет работать.
Чет неподошло в ошибке пишет что не может найти имя файла выводимую абракадабру не поменял, даже символы теже
А, это я тоже ошибся с направлением перекодировки. 
Вот так вот правильно, я проверил:
cfgD.FileName:=UTF8ToSys(Application.EnvironmentVariable['userprofile']+'\file.ini');
Что мы делаем? Мы обращаемся к операционной системе за файлом, следовательно нам надо преобразовать русский текст из UTF-8 в системную кодировку.
Вот так вот правильно, я проверил:
cfgD.FileName:=UTF8ToSys(Application.EnvironmentVariable['userprofile']+'\file.ini');
Что мы делаем? Мы обращаемся к операционной системе за файлом, следовательно нам надо преобразовать русский текст из UTF-8 в системную кодировку.
