Русские символы и кодировки в Linux

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

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

Ответить
Rasmussen
новенький
Сообщения: 13
Зарегистрирован: 02.07.2012 21:33:54

Русские символы и кодировки в Linux

Сообщение Rasmussen »

Добра всем!
Имеется такой вопрос.
Есть ArchLinux x86_64 с KDE на борту.
В чём суть вопроса.
Имеется такой простенький код:

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

var
 inp:char;
 outp:integer;
begin
 inp:='ё';
 outp:=ord(inp);
 writeln(outp);
end.


Итак, его скомпилировать в Lazarus или FPC IDE, то получим такую ошибку:
Error: Incompatible types: got "Constant String" expected "Char"


Однако же если тот же код скомпилировать и запустить в Geany с кодировкой UTF-8 (которая тоже изпользует тот же fpc и передаёт код компилятору командой /usr/bin/fpc "%f"), то всё работает на ура!

Собственно, вопрос - как научить работать FPC и Lazarus с нужной кодировкой?
Насколько я понимаю, это зависит от той кодировки, с которой работает редактор?
Что же я, собственно, делаю не так?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

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

SizeOf(Char) чему равен?
А SizeOf('ё')?
Отсюда вывод, а насчёт Geany не понял. Чушь какая-то.
Rasmussen
новенький
Сообщения: 13
Зарегистрирован: 02.07.2012 21:33:54

Сообщение Rasmussen »

Чушь или нет - судить не мне, однако факт остаётся фактом - в Geany всё отлично срабатывает.
Вот такой код, запущенный из Geany:

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

var
 lat, cyr:char;
begin;
 lat:='ё';
 cyr:='f';
  if (sizeof(lat) = sizeof(cyr)) then
   writeln('True! Lat. = ', sizeof(lat),', cyr. = ', sizeof(cyr))
  else
   writeln('Fail! Lat. = ', sizeof(lat),', cyr. = ', sizeof(cyr));
end.


...возвращает значение:

True! Lat. = 1, cyr. = 1
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

Версия FreePascal какая?
Если 2.7.х - прошу прочесть только что опубликованное: http://sirserge.altai.info/articles/?id=44

Если младьшая, в любом случае при работе с исходником в utf8 забудьте про char. Нет его.
Компилятор все правильно пишет - "ё" это constant string, а inp у вас - несовместимый с присвоением типа char, однобайтовый.
Как работать с utf в lazarus/старых fpc - здесь: http://sirserge.altai.info/articles/?id=41
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Какая разница, fpc работает в UTF8

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

var
  s:string;
  inp:char;
begin
 s:=UTF8ToAnsi('ё')
 inp:=s[1];
 outp:=ord(inp);


Добавлено спустя 6 минут 19 секунд:
Да , UTF8ToAnsi в линукс криво работает
Лучше

UTF8ToCP1251

Добавлено спустя 5 минут 10 секунд:
http://wiki.freepascal.org/LCL_Unicode_Support
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

Ism писал(а):Какая разница, fpc работает в UTF8


В том и разница, если вы ЗАСТАВИТЕ fpc работать в utf-8, то ждет вас весьма неожиданное. :D
А то, что вы приводите в пример - это когда fpc игнорирует кодовую страницу исходника и работает с побайтовым представлением литералов, заключенных в кавычки.

И, переводить юникод в байтовые строки - вообще то искажать обрабатываемую информацию :)

Еще раз, читайте, как сделать правильно: http://sirserge.altai.info/articles/?id=44

Я знаю, что то что там написано, вам не понравится. Но оно не то что Будет, оно уже де-факто Есть.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Ну оно для fpc 2.7 , а он еще не вышел

С UTF8 в fpc 2.6 есть специальный модуль
Rasmussen
новенький
Сообщения: 13
Зарегистрирован: 02.07.2012 21:33:54

Сообщение Rasmussen »

Мда, как-то грустно всё это.
Всех благодарю за помощь!
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Да все отлично у FPC с юникодом, ни разу не встретил проблем !
Самое главное чтобы на "границе" с ОС выполнялось првильное конвертирование OS_LOCALE-vs-UCS2 - а FPC это умеет.
А если нужны текстовые константы внутри исходников - использовать для них WideString либо редактор в кодировке UTF8, ну и компилировать проекты с опцией "-Fcutf8".
Ответить