Проблема : Win32, Кодировка, русский язык

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

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

Проблема : Win32, Кодировка, русский язык

Сообщение Ferrum » 05.09.2009 07:39:45

Всем доброго времени суток!
Проблема на самом деле банальна, но с подвохом...
Вобщем, в лазарус, скажем,
Код: Выделить всё
MessageBox(0,0,'Русь',0);
выдаст сообщение с абракадаброй вместо русского слова. Проблема обходится, если использовать функцию перевода кодировок
Код: Выделить всё
MessageBox(0,0,PChar(UTF8ToAnsi('Русь')),0);
, либо использовать юниты LCLIntf и LCLTypes вместо Windows.
НО ВОТ В ЧЁМ ПРИКОЛ.
Код: Выделить всё
program LazarusApp;

uses
  Windows;

begin
  MessageBox(0,0,'Русь',0);
end.


Если точ-в-точ такую прогу написать в делфи, сохранить как dpr и конвертировать в lpr средствами лазаруса, то ни перевод кодировок, ни пр юниты не нужны, а сообщение само по себе правильно выведется. ТАК В ЧЁМ ПРИКОЛ? те как сделать так, чтобы лазарус выводил всё в нужной кодировке без прочих функций и юнитов, если я пишу проект с нуля?

З Ы
Lazarus 0.9.26.2;
FPC 2.2.2
OS WindowsXP SP3

Проекты:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Ferrum
новенький
 
Сообщения: 14
Зарегистрирован: 27.08.2009 10:11:53

Re: Проблема : Win32, Кодировка, русский язык

Сообщение alexs » 05.09.2009 10:50:30

Изучаем кодировку UTF8, отличия её от WIn1251 и используем поиск на форуме.
PS
Lazarus с версии 0.9.26 перешёл на использование UTF8
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Проблема : Win32, Кодировка, русский язык

Сообщение скалогрыз » 05.09.2009 10:55:36

ты уже ответил сам на свой вопрос!

LCLIntf.MessageBox воспринимает параметры Text и Caption, как строки закодированные в UTF-8. И естественно, когда перед вызовом Win функции делает дополнительное преобразовние из UTF8 в Ansi (или Wide) строку.
Код: Выделить всё
LCLintf.MessageBox(0,nil,'Русь',0);

комплиятор хранит констаны в Ansi кодировке, по-этому происходит этот конфликт, дополнительного преобразования.

Как вариант, попробуй следующее. Начни новый проект.
добавь директиву компиляции:

вместе с {$mode objcfpc}{$h+}
Код: Выделить всё
{$codepage utf8}

это укажет компилятору, что константы в данном модуле хранятся в utf8, тогда использование LCLIntf
не потребует дополнтельных преобразований с константами и 'Русь' выведется правильно.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Проблема : Win32, Кодировка, русский язык

Сообщение Ferrum » 05.09.2009 12:06:47

Да, именно это мне и надо было, большое спасибо! :D
Аватара пользователя
Ferrum
новенький
 
Сообщения: 14
Зарегистрирован: 27.08.2009 10:11:53

Re: Проблема : Win32, Кодировка, русский язык

Сообщение EmeraldMan » 28.09.2009 19:32:09

У меня похожая проблемка, что-то не пойму как решить...
В общем есть такой код
Код: Выделить всё
case s[i] of
    'A': ;
    'B': ;
    'Ы': ;
end;   

Последняя буква русская. Так вот, если кодировка PAS файла Ansi-1251, то компилится отлично, если UTF8, выдает ошибку
Unit1.pas(38,9) Error: Constant and CASE types do not match

Хочется во всех файлах использовать UTF-8, как быть?
Аватара пользователя
EmeraldMan
постоялец
 
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород

Re: Проблема : Win32, Кодировка, русский язык

Сообщение Mr.Smart » 28.09.2009 19:41:49

Переводите строку в WideString, а потом применяйте case конструкцию:
Код: Выделить всё
var
  w: WideString;
begin
  w:=UTF8Decode(s);
  case w[i] of
   #$0410: ; // А
   #$0411: ; // Б
   ....
  end;
end;
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Проблема : Win32, Кодировка, русский язык

Сообщение EmeraldMan » 28.09.2009 20:56:06

Спасибо большое, помогло!
А способа работать, в данном случае, с русскими символами как с латинскими пока нет да?
Чтобы не использовать коды букв.
Аватара пользователя
EmeraldMan
постоялец
 
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород

Re: Проблема : Win32, Кодировка, русский язык

Сообщение Mr.Smart » 28.09.2009 20:58:43

Ну если вам известно, что это будет именно русский текст. заместо преобразования в WideString преобразуйте в AnsiString там с кодами будет по проще :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Проблема : Win32, Кодировка, русский язык

Сообщение Sergei I. Gorelkin » 28.09.2009 21:32:03

Если исходник в кодировке utf-8, компилятор нормально понимает и сами буквы писать вместо кодов.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1397
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Проблема : Win32, Кодировка, русский язык

Сообщение Mr.Smart » 28.09.2009 21:35:55

Sergei I. Gorelkin писал(а):Если исходник в кодировке utf-8, компилятор нормально понимает и сами буквы писать вместо кодов.

Незнаю какой менно компилятор понимает, а 2.2.4 ругается. сообщением вида unit1.pas(36,4) Error: Incompatible types: got "Constant String" expected "WideChar".
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Проблема : Win32, Кодировка, русский язык

Сообщение Sergei I. Gorelkin » 28.09.2009 21:46:37

2.5.1 из svn trunk понимает.
Может, это результат работы недавно добавленной фичи "case of string"?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1397
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Проблема : Win32, Кодировка, русский язык

Сообщение EmeraldMan » 28.09.2009 21:47:01

Тоже хотел поспорить с этим, потому что у самого ругается.
Как вдруг увидел и решил преобразовать файл в UTF-8 c BOM! В итоге перестал ругаться!!! :)
А если просто UTF-8, то не нравится ему...
Кстати по умолчанию в Lazarus идёт как раз просто UTF-8.
Аватара пользователя
EmeraldMan
постоялец
 
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород

Re: Проблема : Win32, Кодировка, русский язык

Сообщение Sergei I. Gorelkin » 28.09.2009 21:53:32

А, тогда понятно.
Естественно, компилятору нужно говорить о кодировке, сам он не догадается.
Либо BOM, либо {$codepage utf8} в начале файла, либо -Fcutf8 в командной строке.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1397
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Проблема : Win32, Кодировка, русский язык

Сообщение Mr.Smart » 28.09.2009 22:17:03

Sergei I. Gorelkin писал(а):Либо BOM, либо {$codepage utf8} в начале файла, либо -Fcutf8 в командной строке.

И что компилятор автоматически будет преобразовывать строки в ANSI где это нужно? Например в RTL?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Проблема : Win32, Кодировка, русский язык

Сообщение Sergei I. Gorelkin » 28.09.2009 22:55:40

Я затрудняюсь сказать насчет конверсий там, где нужно... В последнее время как-то все больше натыкаюсь на неожиданные конверсии там, где не нужно и где совсем не ждешь.

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

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru