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

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

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

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

Сообщение Gust » 16.11.2012 15:56:34

Возможно, тема избитая, но на форуме ответа не нашел.
Есть 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 раз(а).
Gust
новенький
 
Сообщения: 14
Зарегистрирован: 04.03.2011 11:45:24

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

Сообщение Ism » 16.11.2012 18:04:29

Если проблема в кодировке , то есть функция CP1252ToUtf8 и наоборот , только надо подключать модуль, не помню какой.
SysToUtf8 использовать не получится для кириллицы, так как системная кодировка не CP1251
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение Little_Roo » 16.11.2012 18:19:43

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

LAZUTF8 ?
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

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

Сообщение Gust » 16.11.2012 22:27:55

Я нашел эту функцию в модуле lconvencoding.pas.
Спасибо за наводку, в понедельник попробую применить CP1252ToUTF8
Gust
новенький
 
Сообщения: 14
Зарегистрирован: 04.03.2011 11:45:24

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

Сообщение Ism » 16.11.2012 23:38:01

Кодировки CP однобайтовые , а значит надо CP1251ToUtf8
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение Gust » 20.11.2012 09:15:51

Ничего не помогло.
Gust
новенький
 
Сообщения: 14
Зарегистрирован: 04.03.2011 11:45:24

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

Сообщение kosteek » 20.11.2012 10:31:52

Код: Выделить всё
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;
kosteek
постоялец
 
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

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

Сообщение Gust » 21.11.2012 10:00:03

Спасибо, переход на FindFirstUTF8/FindNextUTF8 решил проблему с поиском файлов
Gust
новенький
 
Сообщения: 14
Зарегистрирован: 04.03.2011 11:45:24


Вернуться в Lazarus

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 218

Рейтинг@Mail.ru