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

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

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

Ответить
Review
незнакомец
Сообщения: 2
Зарегистрирован: 18.12.2022 12:51:24

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

Сообщение Review »

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

Обновил 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}, тоже без результата...
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

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

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

  Application.MessageBox('Мама', 'мыла раму');
Review
незнакомец
Сообщения: 2
Зарегистрирован: 18.12.2022 12:51:24

Сообщение Review »

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

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

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

Почему UTF8ToANSI работать перестал, пока так и не понял. Попробую еще поискать информацию...
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

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

Сообщение Sharfik »

У меня 2.0.12, ставил 2.2.2 и откатился назад из-за чушь которую они там понаделали. Программа вообще не запускалась. Может налажали и в 2.2.4 исправили, но тратить в пустую время не хочу. 2.0.12 нормальный.
Seenkao
энтузиаст
Сообщения: 578
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

Конвертация?
вообще чтоб вывести UTF8 надо сменить кодировку страницы на UTF8 (UTF8 с BOM?) или прописать в начале модуля {$codepage UTF8}.
Ответить