Страница 1 из 2
проблемы с кириллицей после трансляции проекта с дельфи
Добавлено: 27.03.2014 14:10:27
ya_vanka
Вот и я дошел до проблемы с русским языком...
Был проект на Delphi. Там с русским все ок.
При переходе на Lazarus под Windows в LCL кракозябры.
Почитал форум сделал так: модуль со строковыми константами перекодировал в UTF8 без BOM. С LCL вроде все ок. Но появились проблемы там, где использовался AnsiString. Поборол конвертацией UTF8ToAnsi.
На Lazarus под Linux с LCL тоже все ок, а вот там где AnsiString проблема осталась.
Я там использую конструкции вида
Поскажите где ошибка?
Re: Русский язык
Добавлено: 27.03.2014 14:37:33
Vadim
ya_vanka писал(а):Поскажите где ошибка?
Дык этот вопрос Вам и будет адресован. Ошибка то чем себя проявляет или это глубокая и неразрешимая тайна?
Re: Русский язык
Добавлено: 27.03.2014 15:16:13
dunin
Господа, вы как-то темы правильно что ли называйте... Например "проблемы с кириллицей после трансляции проекта с дельфи".
А то в свете последних политических событий, и сопутствующего информационного фона, глянул и не понял почему тематика "Русский язык" обсуждается в обучении FreePascal.

Re: Русский язык
Добавлено: 27.03.2014 15:31:06
ya_vanka
Ок, проблема в указанной строчке 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.
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
Re: проблемы с кириллицей после трансляции проекта с дельфи
Добавлено: 27.03.2014 15:50:11
ya_vanka
Т.е. UTF8ToAnsi не работает под Linux?
Re: проблемы с кириллицей после трансляции проекта с дельфи
Добавлено: 27.03.2014 16:06:14
Дож
Т.е. UTF8ToAnsi не работает под Linux?
Под линуксом ему нужен cwstring первый модулем в uses
http://wiki.freepascal.org/LCL_Unicode_ ... 0.BE.D0.BC
Re: проблемы с кириллицей после трансляции проекта с дельфи
Добавлено: 27.03.2014 16:23:50
ya_vanka
Спасибо за ссылку.
Добавил cwstring первым модулем - не работает.
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
Re: проблемы с кириллицей после трансляции проекта с дельфи
Добавлено: 27.03.2014 17:39:10
ya_vanka
А у меня вот этот код (под 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
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
Re: проблемы с кириллицей после трансляции проекта с дельфи
Добавлено: 27.03.2014 18:17:20
ya_vanka
Пара offtop-комментариев по коду
Пример быстро писал, без ошибок не обошлось. В реальном проекте, конечно, стоит Length(Str)-1.
У меня такие же результаты, если я задаю для файла программы кодировку CP1251. Но, как я писал выше, тогда будут проблемы с LCL. Поэтому я ставлю кодировку UTF8 без BOM и этот пример не работает (видимо, из-за невыполнения UTF8ToAnsi).
Re: проблемы с кириллицей после трансляции проекта с дельфи
Добавлено: 27.03.2014 18:22:19
SSerge
ya_vankaUtf8ToAnsi 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)
Re: проблемы с кириллицей после трансляции проекта с дельфи
Добавлено: 27.03.2014 18:23:57
Дож
У меня такие же результаты, если я задаю для файла программы кодировку CP1251.
Дело не в кодировке файла, а в кодировке системы. На основании неё происходит преобразование UTF8ToAnsi — в используемую системную кодировку. Если у Вас кодировка системы установлена в UTF8, то UTF8ToAnsi отрабатывает правильно.
Re: проблемы с кириллицей после трансляции проекта с дельфи
Добавлено: 27.03.2014 18:26:40
ya_vanka
SSerge писал(а):ya_vanka
Провокационный вопрос: текущая локаль вашего линукса UTF8? Угу?
Ну так имеем процесс UTF8 -> WideString -> (Системная локаль, т.е. UTF8)
Мне очень стыдно, но я не понял что из этого следует в моем случае.