Конвертация UTF8 <-> ANSI после обновления FPC не работает?

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

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

Конвертация UTF8 <-> ANSI после обновления FPC не работает?

Сообщение Review » 18.12.2022 14:56:27

Здравствуйте.

Обновил Lazarus с v1.x.x до v2.2.2 и столкнулся с непонятной ситуацией:

Нужно вывести в MessageBox кириллицу, ранее для этого использовал PChar(UTF8ToANSI('АБВ')), и все работало, но сейчас такой вариант отображает не АБВ, а АБВ. Далее, стал смотреть коды символов, чтобы понять, почему так происходит... И тут уже начинается что-то странное:

S:='А'; // S: String;
ShowMessage('#' + IntToStr(Ord(S[1])) + '#' + IntToStr(Ord(S[2])));

Отображает везде #208#144, а вот:

S:=UTF8Decode('А'); // S: String;
ShowMessage('#' + IntToStr(Ord(S[1])) + '#' + IntToStr(Ord(S[2])));

для v1.x.x #192#0, а для v2.2.2 #208#144 :shock: То есть, функция строку никак не преобразует :?

Далее, стал смотреть исходный код функций UTF8Decode и UTF8ToUnicode:
у UTF8Decode разница по сравнению с предыдущей реализацией только в типе параметра: AnsiString (v1.x.x) и AnsiString(CP_NONE) (v2.2.2) Ради интереса пробовал перебирать code page для AnsIString:

CP_ACP = 0; // default to ANSI code page
CP_OEMCP = 1; // default to OEM (console) code page
CP_UTF16 = 1200; // utf-16
CP_UTF16BE = 1201; // unicodeFFFE
CP_UTF7 = 65000; // utf-7
CP_UTF8 = 65001; // utf-8
CP_ASCII = 20127; // us-ascii
CP_NONE = $FFFF; // rawbytestring encoding


Но для 'А' #192 код ни один из них не дает...

В коде UTF8ToUnicode разница тоже только в типе параметра Dest: PWideChar (v1.x.x) и PUnicodeChar (v2.2.2).

В итоге, даже не знаю куда смотреть дальше... Поиск по этому вопросу ничего не подсказал :(

Так же пробовал указывать {$codepage utf8}, тоже без результата...
Review
незнакомец
 
Сообщения: 2
Зарегистрирован: 18.12.2022 13:51:24

Re: Конвертация UTF8 <-> ANSI после обновления FPC не работа

Сообщение iskander » 18.12.2022 18:08:49

Review писал(а):Обновил Lazarus с v1.x.x до v2.2.2 и ...

Так текущий релиз 2.2.4, какой смысл обновляться до 2.2.2?
Review писал(а):Нужно вывести в MessageBox кириллицу, ранее для этого использовал PChar(UTF8ToANSI('АБВ')), и все работало, но сейчас такой вариант отображает не АБВ, а АБВ.

А если попробовать вот так?
Код: Выделить всё
  Application.MessageBox('Мама', 'мыла раму');
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Конвертация UTF8 <-> ANSI после обновления FPC не работа

Сообщение Review » 18.12.2022 19:10:09

iskander писал(а):Так текущий релиз 2.2.4, какой смысл обновляться до 2.2.2?


Обновлял в июле, тогда была 2.2.2. Активно не использовал, и соответственно, с данной проблемой столкнуться не успел. Обновляться до 2.2.4 теперь вообще страшно стало :mrgreen:

iskander писал(а):А если попробовать вот так?
Код: Выделить всё
  Application.MessageBox('Мама', 'мыла раму');


Работает. Мне еще подсказали про UTF8ToWinCP, если использовать его вместо UTF8ToANSI, то кириллица в ANSI отображается правильно, так же про способ с MessageBoxW, но нужно использовать директиву компилятора {$codepage utf8}.

Почему UTF8ToANSI работать перестал, пока так и не понял. Попробую еще поискать информацию...
Review
незнакомец
 
Сообщения: 2
Зарегистрирован: 18.12.2022 13:51:24

Re: Конвертация UTF8 <-> ANSI после обновления FPC не работа

Сообщение iskander » 18.12.2022 19:15:52

Можно почитать вот здесь.
Как бы общий смысл в том, что в подавляющем большинстве случаев вся эта тарабарщина больше не нужна.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Конвертация UTF8 <-> ANSI после обновления FPC не работа

Сообщение Sharfik » 19.12.2022 02:47:20

У меня 2.0.12, ставил 2.2.2 и откатился назад из-за чушь которую они там понаделали. Программа вообще не запускалась. Может налажали и в 2.2.4 исправили, но тратить в пустую время не хочу. 2.0.12 нормальный.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 766
Зарегистрирован: 20.07.2013 01:04:30

Re: Конвертация UTF8 <-> ANSI после обновления FPC не работа

Сообщение Seenkao » 19.12.2022 05:51:52

Конвертация?
вообще чтоб вывести UTF8 надо сменить кодировку страницы на UTF8 (UTF8 с BOM?) или прописать в начале модуля {$codepage UTF8}.
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru