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

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

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

Аватара пользователя
Ferrum
новенький
Сообщения: 14
Зарегистрирован: 27.08.2009 10:11:53

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

Сообщение Ferrum »

Всем доброго времени суток!
Проблема на самом деле банальна, но с подвохом...
Вобщем, в лазарус, скажем,

Код: Выделить всё

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

Проекты:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Изучаем кодировку UTF8, отличия её от WIn1251 и используем поиск на форуме.
PS
Lazarus с версии 0.9.26 перешёл на использование UTF8
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

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

LCLIntf.MessageBox воспринимает параметры Text и Caption, как строки закодированные в UTF-8. И естественно, когда перед вызовом Win функции делает дополнительное преобразовние из UTF8 в Ansi (или Wide) строку.

Код: Выделить всё

LCLintf.MessageBox(0,nil,'Русь',0);

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

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

вместе с {$mode objcfpc}{$h+}

Код: Выделить всё

{$codepage utf8}

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

Сообщение Ferrum »

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

Сообщение EmeraldMan »

У меня похожая проблемка, что-то не пойму как решить...
В общем есть такой код

Код: Выделить всё

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, как быть?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Переводите строку в WideString, а потом применяйте case конструкцию:

Код: Выделить всё

var
  w: WideString;
begin
  w:=UTF8Decode(s);
  case w[i] of
   #$0410: ; // А
   #$0411: ; // Б
   ....
  end;
end;
Аватара пользователя
EmeraldMan
постоялец
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
Контактная информация:

Сообщение EmeraldMan »

Спасибо большое, помогло!
А способа работать, в данном случае, с русскими символами как с латинскими пока нет да?
Чтобы не использовать коды букв.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Ну если вам известно, что это будет именно русский текст. заместо преобразования в WideString преобразуйте в AnsiString там с кодами будет по проще :wink:
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Если исходник в кодировке utf-8, компилятор нормально понимает и сами буквы писать вместо кодов.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

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

Незнаю какой менно компилятор понимает, а 2.2.4 ругается. сообщением вида unit1.pas(36,4) Error: Incompatible types: got "Constant String" expected "WideChar".
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

2.5.1 из svn trunk понимает.
Может, это результат работы недавно добавленной фичи "case of string"?
Аватара пользователя
EmeraldMan
постоялец
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
Контактная информация:

Сообщение EmeraldMan »

Тоже хотел поспорить с этим, потому что у самого ругается.
Как вдруг увидел и решил преобразовать файл в UTF-8 c BOM! В итоге перестал ругаться!!! :)
А если просто UTF-8, то не нравится ему...
Кстати по умолчанию в Lazarus идёт как раз просто UTF-8.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

А, тогда понятно.
Естественно, компилятору нужно говорить о кодировке, сам он не догадается.
Либо BOM, либо {$codepage utf8} в начале файла, либо -Fcutf8 в командной строке.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

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

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

Сообщение Sergei I. Gorelkin »

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

Оно влияет только на строковые константы. Те, которые содержат символы вне ascii диапазона, понимаются как widestring, со всеми вытекающими.
Ответить