2011-06-06 140 views
3

我有这个问题,如果我有:问题ord()和字符串

mychr ='';

其中mychr equival到#255中的 '空间'(手动键入ALT + 255),以及i写:

myord = ORD(mychr)

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

注意:如果我使用:

mychar =#255;

然后正常工作ORD()的返回值。

回答

8

我认为问题在于Windows Alt + Num快捷方式根据本地代码页插入字符,而现代Delphi使用Unicode字符,这些不同(除非值小于或等于127,我认为) 。解决方案是在代码中明确输入值#255。此外,它是一个非常不好的习惯在代码中包含'不可见'特殊字符,因为如果不将其复制到外部工具中,它就不能分辨出它是什么字符!另外,您将不得不信任.pas文件的文本编码。这是最好使用常量像#255。更好的是,

const 
    MY_PRECIOUS_VALUE = #255; 

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

更新

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

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

因此,如果您确实想要继续输入Alt键码,则最好输入Alt和0255并且前导零。

+1

+1 for my_precious .... – RBA 2011-06-06 12:24:25

+1

@Andriy M:你是完全正确的。当然,我正在考虑用前面的零输入* Alt + 0225。 – 2011-07-02 20:31:52

3

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

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是微不足道的y随山黄麻:

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,因此通常德尔福XE AnsiString类型将地图#255到微不足道的y随山黄麻:

FF ÿ Latin Small Letter Y with diaeresis 

可以使用低级别的如CharToOemBuff Windows函数来执行转换或从OEM,或使用OEM AnsiString类型类型:

type 
    TOemString = AnsiString(437); 

在所有情况下,控制台是不是现代的Windows下的进入加剧了文本的最佳方式,和Unicode德尔福XE。

使用InputQuery函数例如应该更安全,因为它会返回一个Unicode string变量。 ;)

+0

你好,我尝试解释更好的我的问题。例如,我有: x:=''; for i:= 0 to 255 do x:= x + chr(i); for i:= 0 to 255 do writeln(ord(x [i])); 简单地说,我想在第二个循环中执行该操作(x [i]),将我的所有值从0恢复为255,正如我在第一个循环中用chr设置的那样。 我已经理解这个问题是关于字符集的,但我问我可以解决它。 我需要解决它,因为有可能正确写一个与文件和字符串读取时间的字符串的所有单个字符。 再次感谢您的帮助。 – Danny 2011-06-07 09:30:10