ord()和字符串的问题

时间:2011-06-06 12:15:36

标签: delphi console-application delphi-xe

我有这个问题,如果我有:

mychr ='';

mychr中的'space'等于#255(手动输入ALT + 255),我写道:

myord = ord(mychr)

到myord返回值160而不是255.当然,同样的问题也是charater ALT + 254等。 我可以解决这个问题吗?我已经在控制台模式下测试了delphi xe。

注意:如果我使用:

mychar =#255;

然后函数ord()正确返回值。

3 个答案:

答案 0 :(得分:9)

我认为问题是Windows Alt + Num快捷方式根据本地代码页插入字符,而现代Delphi使用Unicode字符,这些不同(除非值小于或等于127,我认为)。解决方案是在代码中显式输入值#255。另外,在代码中包含“隐形”特殊字符是非常糟糕的习惯,因为如果不复制到外部工具就无法分辨出它是什么字符!此外,您必须信任.pas文件的文本编码。使用#255之类的常量更好 。更好的是,做

const
  MY_PRECIOUS_VALUE = #255;

并在每次需要时使用此常量。

<强>更新

根据Alt code上的英文维基百科文章:

  

如果键入的数字具有前导0   (零),使用的字符集是   与之匹配的Windows代码页   当前输入区域设置。对于大多数系统   使用拉丁字母,这是   Windows的1252。有关完整列表,请参阅   代码页。如果号码没有   领先的0(零),DOS兼容性   被调用。使用的字符集是   当前的DOS代码页   输入区域设置。对于使用的系统   英文,这是代码页437. For   大多数其他使用拉丁语的系统   字母表,这是代码页850.对于a   完整列表,请参阅代码页。

所以,如果你真的,真的想继续输入Alt键码,你最好输入Alt和0255前导零。

答案 1 :(得分:3)

如果键入ALT+255,则使用DOS代码页;对于437和850个DOS代码页(您可能使用其中一个)#255是NBSP(非破坏空间)。在Unicode中,NBSP是$ A0(160)。这就解释了为什么你获得Ord 160.

答案 2 :(得分:1)

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页面,请参阅this article

MyAnsiChar是从当前代码页转换到OEM控制台代码页后将在控制台上显示的内容。

在Unicode图表中,这个$ 00FF对于trema来说是微不足道的:

U+00FF ÿ Latin Small Letter Y with diaeresis

在控制台下,您将使用OEM char set, i.e. Code Page 347。所以在你的情况下,$ FF不是一个字符,而是一个特殊的代码

FF  NBSP  Non Breaking SPace

在转换回Unicode时转换为U + 00A0:

U+00A0 NBSP  Non Breaking SPace

很可能你在Windows-1252 code page,所以正常情况下,Delphi XE AnsiString会将#255映射到一个带有trema的微小y:

FF ÿ Latin Small Letter Y with diaeresis

您可以使用低级别,例如CharToOemBuff窗口用于执行与OEM的转换,或使用OEM AnsiString类型:

type
  TOemString = AnsiString(437);

在所有情况下,控制台都不是在现代Windows和Unicode Delphi XE下输入强调文本的最佳方式。

使用InputQuery功能,例如应该更安全,因为它将返回Unicode string变量。 ;)