[Решено] Ошибка поиска файлов в нелокализованной Windows

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

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

Ответить
Gust
новенький
Сообщения: 14
Зарегистрирован: 04.03.2011 10:45:24

[Решено] Ошибка поиска файлов в нелокализованной Windows

Сообщение Gust »

Возможно, тема избитая, но на форуме ответа не нашел.
Есть Win2008 Server SR2 SP1 с системной кодировкой win-1252 (узнал при помощи winapi функции GetLocaleInfoA), язык интерфейса - русский. На Lazarus-е необходимо написать небольшую утилиту для запуска скриптов. Имена файлов на кириллице, т.е. win-1251. Вызов

Код: Выделить всё

  FindFirst(Utf8ToSys(<маска поиска, имя каталога содержит кириллицу>), faAnyFile, SearchResult);
  repeat
    FileName := SysToUTF8(SearchResult.Name);
    ListBox.Items.Add(FileName);
  until FindNext(SearchResult) <> 0;

не заполняет ListBox, в него попадает одна строка равная маске поиска, символы из кириллицы заменяются знаком вопроса. Системную кодировку на сервере поменять не можем, т.к. в этом случае перестает работать redmine, а спецов по рельсам у нас совсем нет. Изменение имен файлов скриптов на латиницу тоже невозможно по организационным причинам.

Не понятно какое нужно сделать преобразование кодировок, т.к. получается, что каталог поиска функцией FindFirst не находится. Если заменить маску поиска на каталог с латиницей, то файлы ищутся нормально. При этом в именах файлов символы кириллицы заменяются знаками вопроса, т.е. "FileName := SysToUTF8(SearchResult.Name);" тоже отрабатывает не так как надо.
Менял SysToUTF8/Utf8ToSys на Utf8ToAnsi/AnsiToUTF8, ничего не изменилось.

Подскажите, как можно решить описанную проблему? Может можно где-то выставить, чтобы ansi строки обрабатывались в кодировке win-1251?

Lazarus 1.0.2, fpc 2.6.0
Последний раз редактировалось Gust 22.11.2012 23:33:54, всего редактировалось 2 раза.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: кодировки строк

Сообщение Ism »

Если проблема в кодировке , то есть функция CP1252ToUtf8 и наоборот , только надо подключать модуль, не помню какой.
SysToUtf8 использовать не получится для кириллицы, так как системная кодировка не CP1251
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Re: кодировки строк

Сообщение Little_Roo »

Ism писал(а):надо подключать модуль, не помню какой.

LAZUTF8 ?
Gust
новенький
Сообщения: 14
Зарегистрирован: 04.03.2011 10:45:24

Re: кодировки строк

Сообщение Gust »

Я нашел эту функцию в модуле lconvencoding.pas.
Спасибо за наводку, в понедельник попробую применить CP1252ToUTF8
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: кодировки строк

Сообщение Ism »

Кодировки CP однобайтовые , а значит надо CP1251ToUtf8
Gust
новенький
Сообщения: 14
Зарегистрирован: 04.03.2011 10:45:24

Re: кодировки строк

Сообщение Gust »

Ничего не помогло.
kosteek
постоялец
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск
Контактная информация:

Re: кодировки строк

Сообщение kosteek »

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var SearchResult : TSearchRec;
    FileName : string;
begin
  SetCurrentDirUTF8(GetUserDir);
  FindFirstUTF8('*', faAnyFile, SearchResult);
  repeat
    FileName :=SysToUtf8(SearchResult.Name);
    ListBox1.Items.Add(FileName);
  until FindNext(SearchResult) <> 0;
end;
Gust
новенький
Сообщения: 14
Зарегистрирован: 04.03.2011 10:45:24

Re: кодировки строк

Сообщение Gust »

Спасибо, переход на FindFirstUTF8/FindNextUTF8 решил проблему с поиском файлов
Ответить