Извечная проблема lazarus кириллица и юникод

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

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

Извечная проблема lazarus кириллица и юникод

Сообщение FeLiX » 10.07.2010 21:29:44

Столкнулся с проблемой. Обычно в WIN если в пути встречается кириллица, то приходится использовать UTF8ToSys и SysToUTF8. Но если скажем в пути встречаются две переменные типа
Код: Выделить всё
(UTF8ToSys(AppData+CurUser+PathDelim+'File_name')

то это уже не работает и вылетает ошибка не найден указанный путь.
AppData и СurUser переменные типа string.
Если будет
Код: Выделить всё
(UTF8ToSys(AppData+'File_name')
или
(UTF8ToSys(CurUser+PathDelim+'File_name')

то всё работает, как надо.
И так с любыми вариантами.
Аватара пользователя
FeLiX
новенький
 
Сообщения: 15
Зарегистрирован: 13.02.2010 16:57:20

Re: Извечная проблема lazarus кириллица и юникод

Сообщение А.Н. » 10.07.2010 22:09:23

Бэ, присоединюсь. Попробуй вывести ShowMessage(AppData); ShowMessage(CurUser);
Может, проблема в русских именах?
У меня выдаётся какая-то помойка, если в пути есть русские имена.
Например, на скриншоте вывод вот этого для "Администратор":
Код: Выделить всё
ShowMessage(GetEnvironmentVariableUTF8('USERPROFILE'));
У вас нет необходимых прав для просмотра вложений в этом сообщении.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Извечная проблема lazarus кириллица и юникод

Сообщение dunin » 10.07.2010 23:12:35

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

Re: Извечная проблема lazarus кириллица и юникод

Сообщение Sergei I. Gorelkin » 10.07.2010 23:34:21

Удивительная винда (tm) отдает переменные окружения с помощью одних функций в кодировке 1251, а с помощью других - в 866.
Багрепорт по этому поводу есть.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Извечная проблема lazarus кириллица и юникод

Сообщение скалогрыз » 10.07.2010 23:44:35

Sergei I. Gorelkin писал(а):Багрепорт по этому поводу есть.

в Microsoft? :) хотя, зачем он им, т.к. предупреждение об использовании OEM (консольной) кодировки на страничке есть

http://msdn.microsoft.com/en-us/library/ms683187(VS.85).aspx
Note that the ANSI version of this function, GetEnvironmentStringsA, returns OEM characters.


Как минимум LCL работает неправильно. Вопрос о том правильно или нет функция реализована в RTL, отложится до введения "правильных строк" :)

2 A.H. исправлено в r26586
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Извечная проблема lazarus кириллица и юникод

Сообщение Sergei I. Gorelkin » 11.07.2010 00:50:14

Я об этом баге: http://bugs.freepascal.org/view.php?id=15233
Там в RTL просто непуганый зоопарк. System.GetEnvionmentVariable отдает OEM, то же самое из SysUtils - отдает ANSI. А если поискать, еще штук пять найдется...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Извечная проблема lazarus кириллица и юникод

Сообщение скалогрыз » 11.07.2010 02:12:42

Sergei I. Gorelkin писал(а):Я об этом баге: http://bugs.freepascal.org/view.php?id=15233
Там в RTL просто непуганый зоопарк. System.GetEnvionmentVariable отдает OEM, то же самое из SysUtils - отдает ANSI. А если поискать, еще штук пять найдется...

в System GetEnvironmentVariable? (поиск показывает только на SysUtils)

как раз из FPC SysUtils и возвращает OEM (по коду видно. используется GetEnvironmentStrings, без преобразования кодировки), тогда как в Delphi возвращает ANSI (используется виндовая GetEnvironmentVariable, которая возвращает Ansi). А это баг RTL делфинесовместимости, а может быть даже и фича.

Но ещё правильнее для LCL-а использовать Wide функции :)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Извечная проблема lazarus кириллица и юникод

Сообщение Максим » 11.07.2010 02:48:52

У меня всё никак руки не дойдут приготовить патч, меняющий кодировку на ANSI. :) Надо бы с силами собраться и исправить всё это безобразие. :wink:
Там, кстати, ещё несколько функций от GetEnvironmentVariable зависят. Так что с её починкой зоопарк, вроде как, должен уйти, ну или уменьшиться. :wink:
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 597
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Извечная проблема lazarus кириллица и юникод

Сообщение скалогрыз » 11.07.2010 03:18:55

Максим писал(а):У меня всё никак руки не дойдут приготовить патч, меняющий кодировку на ANSI. :) Надо бы с силами собраться и исправить всё это безобразие. :wink:
Там, кстати, ещё несколько функций от GetEnvironmentVariable зависят. Так что с её починкой зоопарк, вроде как, должен уйти, ну или уменьшиться. :wink:


или начаться новый...
если есть куча написанного кода, который знает о том, что FPC возвращает GetEnvironmentVariable в OEM кодировке.

т.е. код вроде:
Код: Выделить всё
  v := OEMtoAnsi(GetEnvironmentVariable('SOMEPATH'));
  f:=TFileStream.Create( v+PathDelim+'somefile', fmOpenRead);

перестанет работать.
что обеспечит ещё полтонны срача о том, что команде FPC целиком наплевать на своих пользователей :)

Например, только что починенный LCL придётся править так:
Код: Выделить всё
{$ifdef FPC_2_4_2} // берём лучший вариант, что исправлен баг в 2.4.2
  {$define GETEVNVAR_ANSI}
{$endif}
...
function GetEnvironmentVariableUtf8(const s: String): String;
begin
  {$ifdef GETEVNVAR_ANSI}
  Result:=SysToUtf8( SysUtils.GetEnvironmentVariable(s));
  {$else}
  Result:=ConsoleToUtf8( SysUtils.GetEnvironmentVariable(s));
  {$endif}
end;
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Извечная проблема lazarus кириллица и юникод

Сообщение Sergei I. Gorelkin » 11.07.2010 04:13:27

Я о том же... С этим багом основная проблема не в том, чтобы его исправить, а чтобы при этом сломать минимально возможное количество кода.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Извечная проблема lazarus кириллица и юникод

Сообщение FeLiX » 11.07.2010 11:55:07

Упс, кажись меня немного не так поняли.
AppData- переменная, основной путь главных настроек.
СurUser или СurrentUser дальнейший путь для определенного пользователя программы, тобишь имя папки в которой хранится его настройки, на подобии квип или кутим.
Таак другой вариант
Код: Выделить всё
        Img1.LoadFromFile(UTF8ToSys(AppPath + 'Pixmap' + PathDelim +  CurrentIcons + PathDelim +  'Logo.png')); 

Где AppPath путь экзешника, 'Pixmap' имя папки где хранятся изображения, переменная string CurrentIcons имя текущий темы, соответствующая имени папки в Pixmap, откуда надо грузить изображения.
Вот если встречается кириллица, то конечно путь не найден, не смотря на заветное UTF8ToSys().
Если убрать CurrentIcons или AppPath то все ок.
Аватара пользователя
FeLiX
новенький
 
Сообщения: 15
Зарегистрирован: 13.02.2010 16:57:20

Re: Извечная проблема lazarus кириллица и юникод

Сообщение А.Н. » 11.07.2010 12:19:32

Мать-перемать... В жизни бы не подумал, что он ещё может что-то возвращать в OEM.

А, кстати, откуда качать его? На sourceforge так и лежит 0.9.28.2. Или я совсем не в теме?

P.S.: Похоже, всё-таки, придётся своими силами исправлять.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Извечная проблема lazarus кириллица и юникод

Сообщение Brainenjii » 11.07.2010 12:23:49

а CurrentIcons и AppPath точно в UTF8? Попробуйте вывести в лог и их, и результирующую строку
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Извечная проблема lazarus кириллица и юникод

Сообщение скалогрыз » 11.07.2010 12:26:13

FeLiX писал(а):Упс, кажись меня немного не так поняли.
AppData- переменная, основной путь главных настроек.
СurUser или СurrentUser дальнейший путь для определенного пользователя программы, тобишь имя папки в которой хранится его настройки, на подобии квип или кутим.
Таак другой вариант
Код: Выделить всё
        Img1.LoadFromFile(UTF8ToSys(AppPath + 'Pixmap' + PathDelim +  CurrentIcons + PathDelim +  'Logo.png')); 

Где AppPath путь экзешника, 'Pixmap' имя папки где хранятся изображения, переменная string CurrentIcons имя текущий темы, соответствующая имени папки в Pixmap, откуда надо грузить изображения.
Вот если встречается кириллица, то конечно путь не найден, не смотря на заветное UTF8ToSys().
Если убрать CurrentIcons или AppPath то все ок.


AppPath, CurrentIcons - это всё переменные какого типа? уж не WideString-ли?

Добавлено спустя 1 минуту 51 секунду:
А.Н. писал(а):А, кстати, откуда качать его? На sourceforge так и лежит 0.9.28.2. Или я совсем не в теме?

P.S.: Похоже, всё-таки, придётся своими силами исправлять.


Daily snapshots (ака снапшоты, ночные сборки): http://www.hu.freepascal.org/lazarus/ (выбирай 0.9.29, а не 0.9.28-3)

Добавлено спустя 10 минут 4 секунды:
Sergei I. Gorelkin писал(а):Я о том же... С этим багом основная проблема не в том, чтобы его исправить, а чтобы при этом сломать минимально возможное количество кода.


ну так-то можно исправить "малой кровью"
например:
1) исправляем в SysUtils, чтобы значение возвращалось в ANSI кодирвоке.
2) добавляем модуль SysUtilsOld, там пишем такую функцию
Код: Выделить всё
unit SysUtilsOld; deprecated;

function GetEnvironmentVariable(const s: String): String;
begin
  Result:=ANSItoOEM(SysUtils.GetEnvironmentVariable(s))
end;

3) для всех тех, кто использует в своих программах именно OEM результат, нужно просто добавить SysUtilsOld в uses-секцию (обязательно после SysUtils). Все другие должны исходить из того, что возвращается ANSI значение.

Добавление использования всего одного модуля не несёт за собой большого количества правок.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Извечная проблема lazarus кириллица и юникод

Сообщение FeLiX » 12.07.2010 17:16:44

Переменные объявлены, как string. Хотя какие лазарь на самом деле использует, вызывает сомнения. Ради эксперимента пробовал и WideString, эффект разумеется тот же.
Аватара пользователя
FeLiX
новенький
 
Сообщения: 15
Зарегистрирован: 13.02.2010 16:57:20

След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot], Google Adsense [Bot] и гости: 42

Рейтинг@Mail.ru