我有这个问题,如果我有:
mychr ='';
mychr中的'space'等于#255(手动输入ALT + 255),我写道:
myord = ord(mychr)
到myord返回值160而不是255.当然,同样的问题也是charater ALT + 254等。 我可以解决这个问题吗?我已经在控制台模式下测试了delphi xe。
注意:如果我使用:
mychar =#255;
然后函数ord()正确返回值。
答案 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
变量。 ;)