Режим консоли AFAIK использует набор символов OEM Ansi.А в Delphi XE вы находитесь не в мире Ansi, а в мире UCS-2 / Unicode.
var MyChar: char;
MyWideChar: WideChar;
MyAnsiChar: AnsiChar;
begin
MyChar := #255;
MyWideChar := #255;
MyAnsiChar := #255;
Первые две переменные одинаковы, то есть символ с кодом Unicode 255 = $ 00FF, так как в Delphi XE char = WideChar
.Для первой страницы Unicode см. эту статью .
Но MyAnsiChar
- это то, что будет отображаться на консоли после преобразования из текущей кодовой страницы в кодовую страницу консоли OEM.
В диаграмме Unicode эта $ 00FF представляет собой крошечное значение y с тремой:
U+00FF ÿ Latin Small Letter Y with diaeresis
Под консолью вы будете использовать набор символов OEM, т.е. кодовую страницу 347 .Так что в вашем случае $ FF - это НЕ символ, а специальный код
FF NBSP Non Breaking SPace
, который преобразуется в U + 00A0 при преобразовании обратно в Unicode:
U+00A0 NBSP Non Breaking SPace
Это очень вероятночто вы находитесь в кодовой странице Windows-1252 , поэтому обычно Delphi XE AnsiString преобразует # 255 в незначительное значение y с тремой:
FF ÿ Latin Small Letter Y with diaeresis
Вы можете использовать низкий уровень, например CharToOemBuff Windows-функции для выполнения преобразования в или из OEM-производителя или использования OEM-типа AnsiString:
type
TOemString = AnsiString(437);
Во всех случаях консоль не является лучшим способом ввода акцентированного текста всовременные Windows и Unicode Delphi XE.
Использование функции InputQuery
, например, должно быть безопаснее, так как она будет возвращать переменную Unicode string
.;)