Apr 26

Неверное сравнение Wide-строки и символа

Тестовый код:

 

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. agorbachenko
     Add karma Subtract karma  +1
    Цитировать.

    Проблему решает приведение к WideString.

    var
    W: WideString;
    begin
    W := ‘я’;
    if W[1] = WideString(‘я’) then // или if W = WideString(‘я’) then
    ShowMessage(‘Ok’)
    else
    ShowMessage(‘Fail’);
    end;

    1
  2. StarW
     Add karma Subtract karma  +0
    Цитировать.

    Уж тоже спасибо скажу!

    2

Поделитесь вашими мыслями



Ссылки в комментариях будут свободны от nofollow.

Поддерживаемые теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Ссылки в комментариях будут свободны от nofollow.