Тестовый код:
var
W: WideString;
begin
W := 'я';
if W[1] = 'я' then
ShowMessage('Ok')
else
ShowMessage('Fail');
end;
Появляется надпись "Fail".
В строке
W := 'я';
константа 'я' - это Unicode-строка (поскольку мы присваиваем её строке).
Компилятор Delphi берёт ANSI-представление строки ('я'), конвертирует его в Unicode (MultiByteToWideChar) и пишет в исполнимый модуль 4 байта: $4F040000 (первые два - код 'я', два последних - нуль-терминатор).
В строке
if W[1] = 'я' then
константа 'я' рассматривается как символьная, поскольку мы сравниваем её с символом строки. А символьные константы компилятор Delphi всегда рассматривает как ANSI. А это значит, что константа 'я', являющаяся ANSI-символом, представляет собой код 255. И она сравнивается с первым WideChar-ом в строке W. Таким образом, у нас происходит сравнение:
$4F04 = $FF00?
Единственная конструкция, которую мне удалось заставить работать, это:
if W[1] = WideString('я')[1] then
Автор: Александр Алексеев.
Источник: delphikingdom.com
+1