проблемы с кириллицей после трансляции проекта с дельфи

Форум для изучающих FPC и их учителей.

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

проблемы с кириллицей после трансляции проекта с дельфи

Сообщение ya_vanka » 27.03.2014 14:10:27

Вот и я дошел до проблемы с русским языком...

Был проект на Delphi. Там с русским все ок.

При переходе на Lazarus под Windows в LCL кракозябры.
Почитал форум сделал так: модуль со строковыми константами перекодировал в UTF8 без BOM. С LCL вроде все ок. Но появились проблемы там, где использовался AnsiString. Поборол конвертацией UTF8ToAnsi.

На Lazarus под Linux с LCL тоже все ок, а вот там где AnsiString проблема осталась.
Я там использую конструкции вида

Код: Выделить всё
ord(Str[i + 1])     // Str : Ansistring;



Поскажите где ошибка?
Последний раз редактировалось ya_vanka 27.03.2014 15:33:12, всего редактировалось 1 раз.
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

Re: Русский язык

Сообщение Vadim » 27.03.2014 14:37:33

ya_vanka писал(а):Поскажите где ошибка?

Дык этот вопрос Вам и будет адресован. Ошибка то чем себя проявляет или это глубокая и неразрешимая тайна?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Русский язык

Сообщение dunin » 27.03.2014 15:16:13

Господа, вы как-то темы правильно что ли называйте... Например "проблемы с кириллицей после трансляции проекта с дельфи".
А то в свете последних политических событий, и сопутствующего информационного фона, глянул и не понял почему тематика "Русский язык" обсуждается в обучении FreePascal. :?
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Русский язык

Сообщение ya_vanka » 27.03.2014 15:31:06

Ок, проблема в указанной строчке Str[i + 1].

Скажем, приходит строка 40° С.
Str[0] = '4'
Str[1] = '0'
Str[2] = chr(194)
Str[3] = °
Str[4] = ' '
Str[5] = chr(208)
Str[6] = chr(161)

Т.е. Length(Str) = 7 (вместо 5) и появляются доп. символы, причем последние 2 символа вообще непонятно откуда.
Это при том, что над самой строкой Str было произведено преобразование UTF8ToAnsi.
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

Re: Русский язык

Сообщение Дож » 27.03.2014 15:37:09

Последние два символа — это русская буква C в utf-8 кодировке
Код: Выделить всё
[doj@korica ~]$ echo "print hex(208), hex(161)" | python
0xd0 0xa1
[doj@korica ~]$ echo "ПРСТ" | hexdump
0000000 9fd0 a0d0 a1d0 a2d0 000a
0000009
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: проблемы с кириллицей после трансляции проекта с дельфи

Сообщение ya_vanka » 27.03.2014 15:50:11

Т.е. UTF8ToAnsi не работает под Linux?
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

Re: проблемы с кириллицей после трансляции проекта с дельфи

Сообщение Дож » 27.03.2014 16:06:14

Т.е. UTF8ToAnsi не работает под Linux?

Под линуксом ему нужен cwstring первый модулем в uses
http://wiki.freepascal.org/LCL_Unicode_ ... 0.BE.D0.BC
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: проблемы с кириллицей после трансляции проекта с дельфи

Сообщение ya_vanka » 27.03.2014 16:23:50

Спасибо за ссылку.
Добавил cwstring первым модулем - не работает.
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

Re: проблемы с кириллицей после трансляции проекта с дельфи

Сообщение Дож » 27.03.2014 17:09:24

А у меня работает
Код: Выделить всё
[doj@korica ~/temp]$ cat utf8ansi.pas
uses
  cwstring;
var
  S: String;
  A: AnsiString;
  C: AnsiChar;
begin
  Readln(S);
  A := UTF8ToAnsi(S);
  for C in A do
    Writeln(Ord(C));
end.
[doj@korica ~/temp]$ fpc -Mdelphi utf8ansi.pas && echo "ПРСТ" | LC_CTYPE=ru_RU.UTF-8 ./utf8ansi
208
159
208
160
208
161
208
162
[doj@korica ~/temp]$ fpc -Mdelphi utf8ansi.pas && echo "ПРСТ" | LC_CTYPE=ru_RU.CP1251 ./utf8ansi
207
208
209
210
[doj@korica ~/temp]$ fpc -Mdelphi utf8ansi.pas && echo "ПРСТ" | LC_CTYPE=ru_RU.CP866 ./utf8ansi
143
144
145
146
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: проблемы с кириллицей после трансляции проекта с дельфи

Сообщение ya_vanka » 27.03.2014 17:39:10

А у меня вот этот код (под Linux) не работает:

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

uses
  cwstring,
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces // this includes the LCL widgetset
  { you can add units after this };

{$R *.res}

resourcestring
  CommonLatAbbrStr = 'Шир.';
  CommonLatSectorNStr = 'С';
  DegSignStr = '°';

var
  i, OrdChr : integer;
  BufChar, Str : AnsiString;

begin
  Str := UTF8ToAnsi(CommonLatAbbrStr + DegSignStr + CommonLatSectorNStr);

  for i := 0 to Length(Str) - 1 do
  begin
    BufChar := Str[i + 1];
    OrdChr := ord(Str[i + 1]);
  end;
end.


Кодировка файла: UTF8 без BOM
Последний раз редактировалось ya_vanka 27.03.2014 18:17:40, всего редактировалось 1 раз.
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

Re: проблемы с кириллицей после трансляции проекта с дельфи

Сообщение Дож » 27.03.2014 17:48:22

Я добавил печать OrdChr и у меня код работает:
Код: Выделить всё
[doj@korica ~/temp]$ fpc -Mdelphi TestStrings.pas && LC_CTYPE=ru_RU.CP1251 ./TestStrings
216
232
240
46
176
209
0
[doj@korica ~/temp]$ fpc -Mdelphi TestStrings.pas && LC_CTYPE=ru_RU.CP866 ./TestStrings
152
168
224
46
248
145
0


Пара offtop-комментариев по коду
1. cwstring лучше занести под IFNDEF WINDOWS, см. http://freepascal.ru/article/freepascal/20120718142000/
2. символы в AnsiString нумеруются от 1 до Length(S), поэтому Ваш цикл должен идти от 0 до Length(Str)-1
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: проблемы с кириллицей после трансляции проекта с дельфи

Сообщение ya_vanka » 27.03.2014 18:17:20

Пара offtop-комментариев по коду


Пример быстро писал, без ошибок не обошлось. В реальном проекте, конечно, стоит Length(Str)-1.


У меня такие же результаты, если я задаю для файла программы кодировку CP1251. Но, как я писал выше, тогда будут проблемы с LCL. Поэтому я ставлю кодировку UTF8 без BOM и этот пример не работает (видимо, из-за невыполнения UTF8ToAnsi).
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

Re: проблемы с кириллицей после трансляции проекта с дельфи

Сообщение SSerge » 27.03.2014 18:22:19

ya_vanka
Utf8ToAnsi converts an utf8-encode unicode string to an ansistring. It converts the string to a widestring and then converts the widestring to an ansistring.

Провокационный вопрос: текущая локаль вашего линукса UTF8? Угу?
Ну так имеем процесс UTF8 -> WideString -> (Системная локаль, т.е. UTF8)
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: проблемы с кириллицей после трансляции проекта с дельфи

Сообщение Дож » 27.03.2014 18:23:57

У меня такие же результаты, если я задаю для файла программы кодировку CP1251.

Дело не в кодировке файла, а в кодировке системы. На основании неё происходит преобразование UTF8ToAnsi — в используемую системную кодировку. Если у Вас кодировка системы установлена в UTF8, то UTF8ToAnsi отрабатывает правильно.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: проблемы с кириллицей после трансляции проекта с дельфи

Сообщение ya_vanka » 27.03.2014 18:26:40

SSerge писал(а):ya_vanka
Провокационный вопрос: текущая локаль вашего линукса UTF8? Угу?
Ну так имеем процесс UTF8 -> WideString -> (Системная локаль, т.е. UTF8)


Мне очень стыдно, но я не понял что из этого следует в моем случае.
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

След.

Вернуться в Обучение Free Pascal

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

Рейтинг@Mail.ru