Путь файла и кириллица.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Путь файла и кириллица.

Сообщение Роман1971 » 08.02.2009 17:30:00

Столкнулся с проблемой.
При использовании компонентов выдающих пути файлов или каталогов, например TSaveDialog, невозможно воспользоваться результатом ,если в пути есть кириллица(русский текст, например каталог "Мои документы").
Как выйти из этой ситуации?
:?:
Роман1971
новенький
 
Сообщения: 69
Зарегистрирован: 30.05.2007 09:14:53

Re: Путь файла и кириллица.

Сообщение Vadim » 08.02.2009 18:41:02

Дело в том, что Лазарус работает с кодировкой UTF-8, а Windows либо win1251, либо Unicode. Надо конвертировать UTF-8 в Unicode, тогда русский путь будет корректно распознаваться.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Путь файла и кириллица.

Сообщение EmeraldMan » 08.02.2009 19:06:50

Сейчас очень многих людей эта тема волнует: одни последнюю версию установили, другие с Delphi перешли. Поиском форума пользоваться не хотят...
Надо где-нибудь в видном месте большими буквами написать - Новый Lazarus и Кириллица! И там пару нужных функций :)

По теме:
Например, получили имя файла через OpenDialog - он сразу преобразует Win кодировку в UTF-8, которая доступна другим компонентам. Но если захотим открыть такой файл (с кириллицей) например Reset(f); то естественно ничего не получится и надо менять кодировку назад. Тут надо быть внимательным, не все меняет кодировку, TSearchRec - если находит файл, то оставляет его с системной кодировкой. Тут методом тыка надо :)

Пользоваться можно функциями AnsiToUTF8 и UTF8ToAnsi, но лучше SysToUTF8 и UTF8ToSys - более кросс-платформенно получается. Эти функции и вызывают первые две описанные, но только в том случае, если это необходимо.
Аватара пользователя
EmeraldMan
постоялец
 
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород

Re: Путь файла и кириллица.

Сообщение Павел Ишенин » 09.02.2009 17:10:21

Никакого метода тыка.
1. Все что выдается и получается LCL должно быть в utf8.
2. Все что выдается и получается RTL должно быть в системной кодировке.

Перекодировать из UTF8 в системную кодировку можно следующими методами:
1. UTF8Decode - если надо получить WideString из UTF8 строки
2. UTF8ToAnsi - если надо получить AnsiString из UTF8 строки
3. UTF8ToSys - тоже что UTF8ToAnsi, но более избирательно. Проверяет перед перекодировкой необходимость этого
4. UTF8ToConsole - если надо вывести UTF8 строку в консоль например WriteLn(UTF8ToConsole(...)).

соответственно есть и обратные методы
1. UTF8Encode
2. AnsiToUTF8
3. SysToUTF8

Добавлено спустя 1 минуту 52 секунды:
Кроме того, все эти неудобства временные. Пока fpc не поддерживает ansi-строки произвольной кодировки как это умеет delphi 2009.
Павел Ишенин
постоялец
 
Сообщения: 475
Зарегистрирован: 24.03.2007 10:16:52

Re: Путь файла и кириллица.

Сообщение Brainenjii » 01.02.2010 13:01:26

Прошёл год... ^_^ "неудобства временные" продолжаются? По-крайней мере у меня (fpc-2.4.0, lazarus 23544, логин в кириллице) при попытке войти в мои документы проект ругается юникодовыми символами ^_^ Как обойти?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Путь файла и кириллица.

Сообщение eevee » 01.02.2010 15:15:58

Ждем-с FPC 3.0.0 наверное :D
eevee
новенький
 
Сообщения: 63
Зарегистрирован: 29.12.2009 17:52:44
Откуда: Саратов

Re: Путь файла и кириллица.

Сообщение dunin » 02.02.2010 11:58:46

Кусок рабочего кода:
Код: Выделить всё
function winux(Text: String = ''): String;
begin
  {$IFDEF UNIX}
    Result:= Text;
  {$ENDIF}
  {$IFDEF WINDOWS}
    Result:= Utf8ToAnsi(Text);
   {$ENDIF}
end;
...
procedure TMainForm.FormShow(Sender: TObject);
begin
  LabelMess('Загружаем профиль: '+LastProfile);

  LoadBasePathXML(Base, BaseMenuFile);
  if not FileExists(Base.DatabaseName)
    then
      if Mess(
        'Файл базы данных не найден. Возможно файл настроек еще не создан'+#13#13+
        'Окрыть диалог поиска/создания файла Базы данных?',
        MB_YESNOCANCEL + ICONWARNING) = IDYES
          then begin
            if OpenDialog.Execute
              then Base.DatabaseName:= winux(OpenDialog.FileName); // < СЮДА ОБРАЩАЮ ВНИМАНИЕ!!!!
          end;
...

Возможно кому-нибудь чем-нибудь поможет... :?
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Путь файла и кириллица.

Сообщение alexs » 02.02.2010 23:59:47

сть комплект функций - UTF8ToSys и подобные. Именно для этого и предназначены.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Путь файла и кириллица.

Сообщение Brainenjii » 03.02.2010 07:17:26

Ммм... Тут проблема в другом - логин в кириллице... Поэтому "Мои документы" или "Рабочий стол" лежат в папке c кириллицей в пути... И ошибка возникает во время работы диалога... Нажимаешь на "Мои документы" слева - и ошибка... Дескать, не найден путь C:\Documents and settings\<крякозябры>
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Путь файла и кириллица.

Сообщение Brainenjii » 04.02.2010 09:22:25

Ап ^_^ Вот документально потверждение (не фотошоп ^_^)
http://imglink.ru/pictures/04-02-10/a12 ... b5ec2c.png - если выбрать "Мои документы" с панельки слева
http://imglink.ru/pictures/04-02-10/ee4 ... 90f0b8.png - если активировать выпадающий список "Папка" сверху
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Путь файла и кириллица.

Сообщение Vadim » 04.02.2010 10:16:13

Brainenjii
Воспроизвёл Вашу ситуацию:
Изображение
Файл благополучно открылся:
Изображение
В коде открытия написал вот что:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
  If od.Execute Then
  Begin
    label1.Caption:=od.FileName;
    memo1.Lines.LoadFromFile(UTF8ToSys(od.FileName));
  end;
end;
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Путь файла и кириллица.

Сообщение alexs » 04.02.2010 21:20:54

Brainenjii
скорее всего перед открытием окна выбора файла - присвоили свойству FileName или ещё какому начальное значение - не в той кодировке. Просто надо внимательным быть насчёт кодировок.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Путь файла и кириллица.

Сообщение dunin » 10.02.2010 03:43:54

Не совсем то, что у Brainenjii, но близко... а может именно то...

На самом деле не Dialog не работает. Немного в другом проблема
Изображение
Причем, если НЕ кириллица, то все ОК.

Вопрос:
Чем можно ChDir заменить?

Добавлено спустя 7 минут 40 секунд:
dunin писал(а):...
Вопрос:
Чем можно ChDir заменить?

Не... по ночам вредно кодировать. Моцк медленно соображает... проблема решается так:
Код: Выделить всё
ChDir(Utf8ToAnsi(ExtractFileDir(SaveDialog.FileName)));

зы. Пошел спать... :?
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Путь файла и кириллица.

Сообщение v-t-l » 10.02.2010 11:25:05

Только не
dunin писал(а):Utf8ToAnsi
, а Utf8ToSys - так кроссплатформенее :D
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Путь файла и кириллица.

Сообщение dunin » 11.02.2010 09:25:24

Из той же оперы...

Подскажите как правильно переименовать файл из латиницы в кириллицу. ОС - Виндус. Надо что-то вроде этого
Код: Выделить всё
MoveFile(PChar('123.TMP'), PChar(UTF8ToAnsi('Абра козябра.txt')));

Только чтобы работало.

Спасибо.
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 61

Рейтинг@Mail.ru