UTF-8 + FileExists() - бага?

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

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

Re: UTF-8 + FileExists() - бага?

Сообщение Azzx » 02.04.2009 20:27:37

Павел Ишенин писал(а):Для FPC 2.4 скорее всего реализуют поддержку строк вроде тех что появились в D2009, т.е. UTF8String будет сам на лету конвертироваться в системную кодировку.


Сё есть правильно, имхо...

Vadim писал(а):А вот позвольте с Вами не согласиться. :) Чем удобен двухбайтовый Unicode с жёстко фиксированным кол-вом байтов на один символ? Даже ежу понятно, что такая кодировка имеет ту же болезнь, что и более ранние кодировки - семибитная, восьмибитная(однобайтная) - невозможность использования нескольких языков одновременно.


Приемущество они имеют то же самое - константное время доступа к произвольному месту в строке. :)

Sergei I. Gorelkin писал(а):Да нету сейчас "двухбайтового Unicode"

Ну - для совсем энтузиазистов есть UNICODE32, на эту тему сейчас что-то делают в Java. И они, думаю, тоже не просто так это делают.

Хотя вот лично меня интересует другой вопрос - создание универсальной хеш-функции для того же UNICODE16, с приемлемым временем работы... Впрочем - прямо сейчас оно мне не нужно...
Azzx
незнакомец
 
Сообщения: 9
Зарегистрирован: 11.02.2009 11:58:39
Откуда: Ебург

Re: UTF-8 + FileExists() - бага?

Сообщение Vadim » 03.04.2009 07:02:10

Sergei I. Gorelkin
Ну да. И главное среди этих "куча софта" - WinAPI. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: UTF-8 + FileExists() - бага?

Сообщение Павел Ишенин » 03.04.2009 08:05:28

Vadim писал(а):Ну да. И главное среди этих "куча софта" - WinAPI. :)


Где такое сказано?

Может вы пробовали работать с WinApi из fpc? Если да, то fpc был баг в UTF8Decode, UTF8Encode.
Павел Ишенин
постоялец
 
Сообщения: 475
Зарегистрирован: 24.03.2007 10:16:52

Re: UTF-8 + FileExists() - бага?

Сообщение alek111 » 24.06.2009 18:18:17

В WinNT и старше системная кодировка UTF16, а RTL работает так как будто системная кодировка win12xx.
Ручное перекодирование UNICODE <> UTF8 <> ANSI ничего не дает в случае если символы не содержатся в локали.
Перевели-бы уже RTL в UTF8 как и LCL, с тем чтобы эти функции общались с системой через UNICODE а не ANSI.
Аватара пользователя
alek111
новенький
 
Сообщения: 20
Зарегистрирован: 20.06.2006 16:17:50

Re: UTF-8 + FileExists() - бага?

Сообщение Cheb » 25.06.2009 13:05:02

>Если компилировать исходники в Lazarus (т.е. в кодировке UTF-8),

(иными словами - {$codepage utf-8} )
То все строки с русскими буквами из этого исходника ОКАЖУТСЯ В UTF-16! То есть это WideString.
Наоборот, под виндовсом FileExists() (и вообще ВСЁ - от процедур поиска до TStream) работают не в UTF-8 а в системной однобайтной кодировке! (скорее всего CP1251). ФриПаскаль по умолчанию преобразует широкую строку в ансистроку в системной кодировке, т.е. надо писать:

FileExists('...Мои Документы...'); //молчаливое преобразование Wide -> Ansi
но
FileExists('... Мои Документы\' + Utf8Decode(Edit1.Text));
и
Edit1.Text:= Utf8Encode('...рузкий тегст...');

Я сейчас работаю в Лазаре 0.9.26, всё отлично работает - надо только не забывать заворачивать все присваивания строк визуальных компонентов в Utf8Encode/Utf8Decode.

>Перевели-бы уже RTL в UTF8 как и LCL, с тем чтобы эти функции общались с системой через UNICODE а не ANSI.
Стоп, стоп, стоп. А как же тогда поддержка Windows 98?
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: UTF-8 + FileExists() - бага?

Сообщение alek111 » 25.06.2009 13:41:10

Cheb писал(а):Стоп, стоп, стоп. А как же тогда поддержка Windows 98?

Во первых, WinNT и Win95/98 это две совершенно разные системы с похожим (но не одинаковым) API. Во вторых, если уж на то пошло, системная кодировка в WinNT - UTF-16, а в Win95/98 - ANSI. В третьих, для Win98 есть какая-то штука от MS которая позволяет использовать Wide-версии вызовов (кажется Unicode compatibility level, или что-то в этом роде). Следовательно RTL должен корректно распознавать эти моменты и использовать в каждом случае СИСТЕМНУЮ кодировку, а не затычку для совместимости со старыми системами, которые по сути не старые, а просто другие, но внешне похожие.
Аватара пользователя
alek111
новенький
 
Сообщения: 20
Зарегистрирован: 20.06.2006 16:17:50

Re: UTF-8 + FileExists() - бага?

Сообщение Cheb » 25.06.2009 14:28:14

>кажется Unicode compatibility level, или что-то в этом роде
MSLUI, емнип. И, кстати, я недавно ставил Win98 SP2 - на ней, на голой, уже поддержка юникода есть (вероятно входит в сервис-пак) - но за вычетом некоторых редких функций.

было:
Код: Выделить всё
          case msg.message of
            WM_KEYDOWN:
              begin
                scancode:= DivineScanCode(msg);
                numchars:=0;
                if MotherState.TextInput then begin
                  GetKeyboardState(@KeyboardState[0]);
                  numchars:=ToUnicode(msg.wparam, (msg.lParam shr 16) and $FF, @KeyboardState[0], @buff[0], 10, 0);
                end;


наткнувшись на эту багу пришлось добавить:
Код: Выделить всё
          case msg.message of
            WM_KEYDOWN:
              begin
                scancode:= DivineScanCode(msg);
                numchars:=0;
                if MotherState.TextInput then begin
                  GetKeyboardState(@KeyboardState[0]);
                  numchars:=ToUnicode(msg.wparam, (msg.lParam shr 16) and $FF, @KeyboardState[0], @buff[0], 10, 0);
                  if (NumChars = 0) and (MotherState.OS = ostWin9x) then begin
                    //Windows 98 doesn't have the Unicode support installed.
                    //  Assuming system locale to be Russian/Cyrillic CP1251
                    numchars:= ToAscii(msg.wparam, (msg.lParam shr 16) and $FF, @KeyboardState[0], @abuff[0], 0);
                    for i:=0 to numchars - 1 do
                      buff[i]:= Cp1251CharToWideChar(abuff[i]);
                  end;
                end;
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: UTF-8 + FileExists() - бага?

Сообщение Sergei I. Gorelkin » 25.06.2009 17:07:05

Наоборот, поддержка W-вариантов API там (во всех Win9x) есть у нескольких избранных функций. Остальные присутствуют в виде заглушек.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Пред.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru