Русский язык + Lazarus + Linux
Модератор: Модераторы
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Случайно опция компилятора "-Fcutf8" при сборке проекта не нужна ? Только с этой опцией строковые константы в кодировке UTF8, вписанные прямо в коде ( текст MessageBox,..) безо всяких "Localize" - будут приняты и откомпилированы. Опция стала рабочей отностительно недавно ( Мартин, автор MSE* - довел ее до ума ).
Attid писал(а):окружение у меня utf8
lazarus запускается скриптом с локалью 1251
...
где грабли ?
iii. This unit tested with dc_utf8 and user's locale koi8-r only
У меня нет такой локали, могу только теоретически подсказать, по аналогии с koi8r, т.к. здесь сталкивался с такой же проблемой (было еще line too long).
Для исправления ошибки я бы:
1. проверил, что возвращает GetCodeset из-под IDE: должно сответствовать (но не обязательно совпадать) константе DEV_CODESET - ее значение тоже можно проверить.
2. проверил, что возвращает GetCodeset и DEV_CODESET при запуске без IDE. В этом случае они должны быть разные: между этими кодировками и происходит конвертирование.
3. проверил, работает ли iconv из shell между этими кодировками (должно). Если да, то
4. проверил, работает ли связка
Код: Выделить всё
function uiconv(ic_usr:pointer; source:ansistring):ansistring ;
function uiconv_open(ic_from, ic_to:ansistring):pointer ;
//здесь ic_from будет CP1251(DEV_CODESET) ic_to - UTF8(GEtCodeset)
procedure uiconv_close(ic_usr:pointer) ;
5. Если да, то внимательно изучил бы строку, которая возвращается от _iconv. В ней могут быть недопустимые символы, которые не воспринимает загрузчик формы.
Если нет, поработал бы со значениями
outlength,
outleft(!!!) и т.п. в теле _iconv. Дело в том, что я попытался сделать общую функцию для всех перекодировок за счет запасного объема. Кое-где мог и напутать.
6. Так или иначе все исправил бы и выложил сюда исправления к модулю
- Attid
- долгожитель
- Сообщения: 2589
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
debi12345
не понятная опция у меня не нее очень сильно ругается
поэтому как её едят я не знаю .
ab
при {$DEFINE DC_WIN} теперь запускается нормально под IDE
и без ошибки без IDE (исправил ошибки с локалями в системе)
но запускается с крокозяками
в консоль все выводится нормально
кракозяки напоминают открытие ЮТФ файла в 1251 !
хотя опять же могут быть глюки дистрибутива.
ЗЫ а добавить локаль это всего одна строчка
Случайно опция компилятора "-Fcutf8" при сборке проекта не нужна ? Только с этой опцией строковые константы в кодировке UTF8, вписанные прямо в коде
не понятная опция у меня не нее очень сильно ругается
Код: Выделить всё
cConst = 'пример констанкты';
uconst.pas(33,16) Error: Malformed UTF-8 string
uconst.pas(33,16) Error: UTF-8 code greater than 65535 found
uconst.pas(33,16) Error: Malformed UTF-8 string
uconst.pas(33,16) Error: Malformed UTF-8 stringпоэтому как её едят я не знаю .
ab
при {$DEFINE DC_WIN} теперь запускается нормально под IDE
и без ошибки без IDE (исправил ошибки с локалями в системе)
но запускается с крокозяками
в консоль все выводится нормально
Код: Выделить всё
код :
WriteLn('GetCodeset()',GetCodeset());
writeln('Бла бла бла');
writeln(Localize('Бла бла бла'));
*****
initialization
{$I fdesk.lrs}
LocalizeForm('TfmDesk');
*****
$ LANG=ru_RU.cp1251 ./acdesk
GetCodeset()CP1251
��� ��� �
��� ��� �
###на форме все по русски
$ LANG=ru_RU.UTF-8 ./acdesk
GetCodeset()UTF-8
��� ��� �
Бла бла бла
###на форме кракозяки
кракозяки напоминают открытие ЮТФ файла в 1251 !
хотя опять же могут быть глюки дистрибутива.
ЗЫ а добавить локаль это всего одна строчка
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Attid писал(а):Случайно опция компилятора "-Fcutf8" при сборке проекта не нужна ? Только с этой опцией строковые константы в кодировке UTF8, вписанные прямо в коде
не понятная опция у меня не нее очень сильно ругается
Если исходники в формате UTF8-сохраняются - без этой опции никак. Если в KOI/WIN - будут матюки.
при {$DEFINE DC_WIN} теперь запускается нормально под IDE
и без ошибки без IDE (исправил ошибки с локалями в системе)
но запускается с крокозяками
Блин, народ - ну пинайте команду - чтобы они данный вопрос радикально решили !!! Исходники в UTF8 и опция -Fcutf8 дают 100% работающее решения для ЛЮБОЙ операционки и локали.
Attid писал(а):при {$DEFINE DC_WIN} теперь запускается нормально под IDE
и без ошибки без IDE (исправил ошибки с локалями в системе)
но запускается с крокозяками
в консоль все выводится нормально
кракозяки напоминают открытие ЮТФ файла в 1251 !
хотя опять же могут быть глюки дистрибутива.
Скорее всего, это глюки Localizeform? Может быть, завтра попробую проверить.
Attid писал(а):ЗЫ а добавить локаль это всего одна строчка ;)
Какая:?
- Attid
- долгожитель
- Сообщения: 2589
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
Какая:?
Код: Выделить всё
localedef -c -i ru_RU -f cp1251 ru_RU.cp1251с правами рута
еще вопрос
гуиншое приложение определяет локаль нормально,
а вот консольное нет =(
консольное приложение возрощает
GetCodeset()ANSI_X3.4-1968
мой $ locale
LANG=ru_RU.UTF-8
Всем доброго и с Наступающим!
Linux. Когда стоял Lazarus 1.0.8, сделал аналог LowerCase для кириллицы по тупому
Поставил 2.0.10 - перестало работать, теперь так
Понимаю, UTF8 - двухбайтовая кодировка, но что изменилось?
Linux. Когда стоял Lazarus 1.0.8, сделал аналог LowerCase для кириллицы по тупому
Код: Выделить всё
s:String;
/////////////////////
if s = 'А' then
s := 'а';
if s = 'Б' then
s := 'б';
if s = 'В' then
s := 'в';
if s = 'Г' then
s := 'г'; Поставил 2.0.10 - перестало работать, теперь так
Код: Выделить всё
s:=Edit1.Text;//А - кириллица
s:=s[1]+s[2];
if s='А' then ss:='а';
Label1.Caption:=ss;//а -кириллицаПонимаю, UTF8 - двухбайтовая кодировка, но что изменилось?
Владимир писал(а):но что изменилось?
Именно то, что Вы и написали:
Владимир писал(а):UTF8 - двухбайтовая кодировка
Правда двухбайтовая она для русского. Для латиницы она продолжает оставаться однобайтовой.
Код: Выделить всё
Var
s, s1: string;
Begin
s:='Карацупа';
WriteLn(s);
Writeln;
Write(s[1]);
Write(s[2]);
WriteLn;
s1:=s[1]+s[2];
If s1='К' Then
Begin
s1:='к';
WriteLn(s1)
End
Else
WriteLn(s1);
end.Как видно, теперь в массиве символов 1 символ - это именно 2 байта (s[1] и s[2]), а не один, как это было раньше или как это есть сейчас для латиницы. Т.е. всё очевидно и понятно.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Vadim писал(а):Как видно, теперь в массиве символов 1 символ - это именно 2 байта (s[1] и s[2]), а не один, как это было раньше или как это есть сейчас для латиницы. Т.е. всё очевидно и понятно.
Собственно проблема в организации регистронезависимого поиска подстроки в строке, где может быть и латиница и кириллица с использованием AnsiPos().
Теперь что, "идти" по строке, выяснять одно- или двухбайтовый символ, приводить к нижнему регистру и искать... LowerCase для кириллицы еще не придумали?
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Владимир, давным давно добавлены UTF8UpperCase и аналогичные функции работы с UTF8. В модуле lazutf8.
Владимир, пользуйтесь юникодом. Там все символы LongWord. И переводите себе на здоровье из UTF8 в Unicode и обратно, если есть желание.
Снег Север писал(а):Владимир, давным давно добавлены UTF8UpperCase и аналогичные функции работы с UTF8. В модуле lazutf8
Спасибо, но в 2.0.10 не работает с кириллицей.
Добавлено спустя 3 минуты 5 секунд:
Seenkao писал(а):Там все символы LongWord. И переводите себе на здоровье из UTF8 в Unicode и обратно, если есть желание.
Спасибо, пробую.
Добавлено спустя 25 минут 45 секунд:
Снег Север писал(а):Владимир, давным давно добавлены UTF8UpperCase и аналогичные функции работы с UTF8. В модуле lazutf8.
Может я чего не понимаю, но под Linux Лазарус с некоторого времени уже под UTF8, а модуль lazUTF8 был написан как переходной?
Владимир писал(а):Спасибо, но в 2.0.10 не работает с кириллицей.
Да вроде работает...
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Caption:=UTF8UpperCase(Edit1.Text);
end;У вас нет необходимых прав для просмотра вложений в этом сообщении.
Vadim писал(а):Да вроде работает...
О как! В новом проекте заработало... Спасибо! Разбираюсь со старым.
