Обновил 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


Далее, стал смотреть исходный код функций 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}, тоже без результата...