| |
| | | | |
Александр Алексеев дата публикации 24-04-2008 02:49 КАТЕГОРИЯ | | КОМПИЛЯТОР.Неверное сравнение Wide-строки и символа | ПРОДУКТ | | Delphi | ПЛАТФОРМА | | Windows |
Проверялось на Delphi 7.
Тестовый код:
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
Можно спорить о том, к какой категории относится этот камень - ПРОГРАММИСТ или КОМПИЛЯТОР. Но компилятор как средство, абстрагирующее программиста от особенностей представления Wide и ANSI символов и строк, должен обекспечивать автоматическую конверсию в подобных случаях. Код не должен меняться при замене ANSI строк на Wide, и правильность конструкций должна сохраняться.
Обсуждение материала [ 29-07-2008 09:33 ] 12 сообщений |
|
| | | | |
| |
Время на сайте: GMT минус 5 часов
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.
©
При использовании любых материалов «Королевства Delphi»
необходимо указывать источник информации.
Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются
собственностью их производителей.