Избитый вопрос про кириллицу

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

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

Re: Избитый вопрос про кириллицу

Сообщение xdsl » 24.02.2014 23:28:27

Проблемы лазаруса с $codepage или BOM объясняются очень просто.
Freepascal при использовании $codepage или BOM переводит в исходнике все строковые константы в unicodestring с кодировкой UCS2.
Выполнение Caption:='Привет' прозрачно преобразовывает 'Привет' из unicodestring в TCaption. Преобразование пропускается сквозь менеджер широких строк, который unicodestring переводит в TCaption (а это обычный string) в системной кодировке. Под виндой системная кодировка - CP1251. В результате в Caption будет 'Привет' в CP1251, в то время как лазарус ожидает все строковые параметры в UTF-8, со всеми отсюда вытекающими.

Варианты решения:
1) не использовать $codepage или BOM
2) не использовать строковых констант, widestring, unicodestring ни в каком виде
3) не использовать винду ;)
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Избитый вопрос про кириллицу

Сообщение Little_Roo » 24.02.2014 23:49:56

xdsl писал(а):3) не использовать винду ;)

Улыбнуло... :D
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Избитый вопрос про кириллицу

Сообщение SSerge » 25.02.2014 05:07:00

xdsl писал(а):TCaption (а это обычный string)


А вам не кажется, что корни ошибки в том, что TCaption с какого то рожна "обычный string", а не UTF8String, как должно быть, и отсюда все рога? Так же как с остальными функциями LCL.

xdsl писал(а):2) не использовать строковых констант, widestring, unicodestring ни в каком виде


Да ну уж... Вполне поддаются явному преобразованию

xdsl писал(а):3) не использовать винду


Здесь отдельный вопрос... Мне вот всё интересно, а существует ли еще какой-либо подобный прецедент по другим странам, когда кодировка консоли отличается от кодировки системной локали. И почему-то кажется, что виновником данного рода порнографии является Академия наук СССР и Госстандарт, подразумевавшие под "Основной кодировкой ДОС" нечто оторванное от реальности, применявшееся в одной единственной дурацкой ЭВМ "Мазовия" и больше нигде.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Избитый вопрос про кириллицу

Сообщение xdsl » 25.02.2014 07:28:18

SSerge писал(а):А вам не кажется, что корни ошибки в том, что TCaption с какого то рожна "обычный string", а не UTF8String, как должно быть, и отсюда все рога? Так же как с остальными функциями LCL.

Загляните в исходники fpc. systemh.inc: type UTF8String = type ansistring;
Так-что UTF8String от string отличий не имеет. fpc 2.6.2

SSerge писал(а):
xdsl писал(а):2) не использовать строковых констант, widestring, unicodestring ни в каком виде

Да ну уж... Вполне поддаются явному преобразованию

Поддаются. Только смысла не вижу такое использовать вне винды.

SSerge писал(а):
xdsl писал(а):3) не использовать винду

Здесь отдельный вопрос... Мне вот всё интересно, а существует ли еще какой-либо подобный прецедент по другим странам, когда кодировка консоли отличается от кодировки системной локали. И почему-то кажется, что виновником данного рода порнографии является Академия наук СССР и Госстандарт, подразумевавшие под "Основной кодировкой ДОС" нечто оторванное от реальности, применявшееся в одной единственной дурацкой ЭВМ "Мазовия" и больше нигде.

Это не в академию наук камушки кидать надо, а в microsoft. Академия наук и госстандарты к винде никакого отношения не имеют. Тем более что нет основной кодировки дос, а есть "Основная кодировка ГОСТ", она-же КОИ-8 В1 (ГОСТ Р 34.303-92), она же ISO/IEC-8859-5 и не использующаяся в windows ни в локали ни в консоли, хотя возможность переключить на нее консоль вроде как есть. В терминале виндовс применяется CP866, она же IBM866, она-же КОИ-8 Н2 (ГОСТ Р 34.303-92), она же "Альтернативная кодировка ГОСТ".

Единственное, за что стоит пинать госстандарт, это за то что ГОСТ 19768-74 с вменяемой юниксовой кодировкой KOI8-R заменили на ГОСТ 19768-93 с мертворожденной ДКОИ для ЕС ЭВМ.
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Избитый вопрос про кириллицу

Сообщение Vadim » 25.02.2014 08:10:24

xdsl писал(а):Это не в академию наук камушки кидать надо, а в microsoft.

Не надо камушки в Микрософт кидать. В своё время Микрософт запрашивало советское правительство, какую кодировку советских строк сделать в винде. Советское правительство по-советски пожало плечами и спросило "А что такое винда?". :-) Так что сами понимаете - Микрософт сделало кодировку в винде с точки зрения своего разумения кирилицы, т.к. советское правительство посчитало излишним разглашать военные секреты про нашу кодировку ... ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Избитый вопрос про кириллицу

Сообщение SSerge » 25.02.2014 08:22:58

xdsl писал(а):Загляните в исходники fpc. systemh.inc: type UTF8String = type ansistring;
Так-что UTF8String от string отличий не имеет. fpc 2.6.2


Код: Выделить всё
  UTF8String          = type AnsiString(CP_UTF8);


Так что UTF8String является AnsiString'ом, маркированным кодовой страницей UTF8, а это не одно и то же, что просто AnsiString. FPC2.7.x
А в вашем 2.6.x вообще нельзя полагаться на какие либо правила внутренней конверсии под Windows - cp866 консоли он не видит принципиально, врёт на неявных преобразованиях в WideString, а UnicodeString у него = WideString :D
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Избитый вопрос про кириллицу

Сообщение xdsl » 25.02.2014 08:42:38

Vadim писал(а):
xdsl писал(а):Это не в академию наук камушки кидать надо, а в microsoft.

Не надо камушки в Микрософт кидать. В своё время Микрософт запрашивало советское правительство, какую кодировку советских строк сделать в винде. Советское правительство по-советски пожало плечами и спросило "А что такое винда?". :-) Так что сами понимаете - Микрософт сделало кодировку в винде с точки зрения своего разумения кирилицы, т.к. советское правительство посчитало излишним разглашать военные секреты про нашу кодировку ... ;-)
Ну как не надо-то. SSerge виноватого ищет в том, что кодировки системы и консоли различны. И я говорю, и Вы подтверждаете, что академия наук никаким боком непричастна к этому факту.

SSerge писал(а):Так что UTF8String является AnsiString'ом, маркированным кодовой страницей cp1251, а это не одно и то же, что просто AnsiString. FPC2.7.x
А в ваше 2.6.x вообще нельзя полагаться на какие либо правила внутренней конверсии под Windows - cp866 консоли он не видит принципиально, врёт на WideString, а UnicodeString у него = WideString :D
fpc 2.6.2 на сейчас релиз. Все остальное - альфы, беты, девелопинг, эксперимент онли. Хотя каждому - свое, лично мне стабильность и предсказуемость работы программы дороже новых фичей.
И очень хочется увидеть код, где 1) fpc 2.6.2 "врет на WideString", и 2) где под Windows у fpc 2.6.2 widestring=unicodestring, такое я видел только под линуксом, как это и утверждает код из options.pas компилятора fpc 2.6.2:
Код: Выделить всё
  if not(target_info.system in systems_windows) then
    def_system_macro('FPC_WIDESTRING_EQUAL_UNICODESTRING');
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Избитый вопрос про кириллицу

Сообщение SSerge » 25.02.2014 09:33:20

xdsl писал(а):fpc 2.6.2 на сейчас релиз. Все остальное - альфы, беты, девелопинг, эксперимент онли


Друг мой, до вас еще до сих пор не дошло, что "релиз" - это Delphi XE5, а все fpc - это альфы, беты, девелопинг, эксперимени онли, включая "релизы", не добравшиеся даже до Delphi 2005 по качеству реализации? :D Соотношение примерно такое же (а то и с еще большим разрывом), как между gcc и MinGW. Второе вроде бы "то же самое" что и первое, однако на деле другой диалект, да еще и криво реализованный.


xdsl писал(а):лично мне стабильность и предсказуемость работы программы дороже новых фичей.


Эта стабильность в дальнейшем вам может аукнуться трудно диагностируемыми глюками в коде, когда 2.8 станет релизом. Правда, зависит от того, как вы там чего напишете. Я же склонен не использовать для каких либо значимых проектов ни то, ни другое за провально низкое и непредсказуемое поведение строковых операции и генерацию промежуточных переменных, не поддающуюся нормальной логике. В итоге не слабо оптимизированная программа работает так же по скорости, как алгоритм на яве, вообще не подвершавшийся никакой оптимизации. А уж Unicode, бггг... Не, я понимаю падение производительности на wcstr на 15-20%, но не понимаю этого падения в 4-6 раз при замене AnsiString на UnicodeString.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Избитый вопрос про кириллицу

Сообщение xdsl » 25.02.2014 10:01:26

Релиз для Delphi - XE5, для fpc - 2.6.2. Не мешайте горькое с соленым, у каждого продукта своя ниша. И лично мне релизы Delphi никуда не упираются, кроссплатформенный юниксово-виндовый продукт на этом не сделаешь.
Я же склонен не использовать для каких либо значимых проектов ни то, ни другое за провально низкое и непредсказуемое поведение строковых операции и генерацию промежуточных переменных, не поддающуюся нормальной логике.

И логика есть и предсказуемость. И скорость вполне адекватная. Впрочем, можете свои слова подтвердить программным кодом.
В итоге не слабо оптимизированная программа работает так же по скорости, как алгоритм на яве, вообще не подвершавшийся никакой оптимизации. А уж Unicode, бггг... Не, я понимаю падение производительности на wcstr на 15-20%, но не понимаю этого падения в 4-6 раз при замене AnsiString на UnicodeString.

Один умный человек на это сказал "Talk is cheap. Show me the code". Покажите нам код: "Алгоритм на яве" + "не слабо оптимизированная программа". Последняя на fpc, как я понимаю, иначе не стоило и огород городить. Плюс программу, где вы, по вашим словам, заменили AnsiString на UnicodeString и получили падение в производительности в 4-6 раз.
А мы это все на досуге скомпилируем и проверим. И вместе проанализируем результаты.
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Избитый вопрос про кириллицу

Сообщение SSerge » 25.02.2014 10:17:53

xdsl писал(а):Покажите нам код


xdsl
Время на это нужно и стимул какой-то, хотя бы в виде самопознания. Как оформится во что-то удобочитаемое, так и ссылка здесь на материалы несомненно будет.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Избитый вопрос про кириллицу

Сообщение xdsl » 25.02.2014 10:20:07

SSerge писал(а):
xdsl писал(а):Покажите нам код


xdsl
Время на это нужно и стимул какой-то, хотя бы в виде самопознания. Как оформится во что-то удобочитаемое, так и ссылка здесь на материалы несомненно будет.

Заранее спасибо, будем ждать.
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Пред.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru