Delphi 如何输入以小数表示的字符?

Delphi 如何输入以小数表示的字符?,delphi,unicode,Delphi,Unicode,如何将Delphi 7中以小数(#0、#1、#9、#10、#13、#32、#128、#255)表示的字符移植到Delphi Unicode?有些文档(如Embarcadero的“Unicode世界中的Delphi”)只说应该用实际字符替换它们。例如,我应该使用“€”而不是“128”。但是你会怎么处理#0???还是#9?还是#13 更新: 看起来这是个棘手的问题。有人在这里说,128以下的所有字符保持不变。然而,“Unicode世界中的Delphi”却指出了另一个问题。因此,有一种方法可以在De

如何将Delphi 7中以小数(#0、#1、#9、#10、#13、#32、#128、#255)表示的字符移植到Delphi Unicode?有些文档(如Embarcadero的“Unicode世界中的Delphi”)只说应该用实际字符替换它们。例如,我应该使用“€”而不是“128”。但是你会怎么处理#0???还是#9?还是#13


更新:


看起来这是个棘手的问题。有人在这里说,128以下的所有字符保持不变。然而,“Unicode世界中的Delphi”却指出了另一个问题。因此,有一种方法可以在Delphi XE中使用像#9这样的东西,或者将代码从Delphi 7移植到Delphi Unicode会涉及大量的代码更改?

ANSI代码的下半部分[#0..#127]在转换为Unicode后不会更改,因此您不应该为此烦恼。高半部[128..255]更复杂。编译器解释行

const s1:AnsiString = #200;
const s2:UnicodeString = #200;
取决于{$HIGHCHARUNICODE}指令

{$HIGHCHARUNICODE OFF}          // default setting on Delphi 2009
const s1:AnsiString = #200;     // Ord(s1[1]) = $C8 = 200
const s2:UnicodeString = #200;  // Ord(s2[1]) depends on Codepage
                                //  on my Win1251 = $418  

{$HIGHCHARUNICODE ON}
const s1:AnsiString = #200;     // Ord(s1[1]) depends on Codepage
                                //   on my Win1251 = $45
const s2:UnicodeString = #200;  // Ord(s2[1]) = $C8 = 200
#200在Win1251代码页上为“П”。'crmk_'的Unicode码点为$418

另一方面,在Unicode中,200是“È”。Win1251没有“È”字符,Unicode->Win1251转换会将其转换为“E”,对于所有ANSI代码页,E为45美元

使用{$HIGHCHARUNICODE OFF},编译器根据系统代码页将#128..255个字符解释为ANSI字符,如有必要,将它们转换为unicode代码点

使用{$HIGHCHARUNICODE ON},编译器将#128..#255个字符解释为Unicode码点,如果需要,将它们转换为ANSI字符,可能会丢失


更新

我现在看到了在Unicode Delphi上运行错误的问题代码:

var
  Buf: array[0..32] of Char;
begin
  FillChar(Buf, Length(Buf), #9);
  ShowMessage(Format('%d %d %d', [Ord(Buf[0]), Ord(Buf[0]), Ord(Buf[16])]));
end;

但这是错误的
FillChar
过程用法的一个例子
FillChar
只是用字节填充目标缓冲区(顺便说一句,在上面的示例中,只填充Buf的前半部分),并忽略所有新的Unicode内容
FillChar
现在应该用FillBytes重命名,并且禁止在第三个参数中使用字符(#9)。

+1表示
{$HIGHCHARUNICODE}
。默认关闭非常有意义,因为它允许代码不加更改地编译。删除我的答案是因为我更喜欢你的答案@Cosmin:我的帖子没有回答OP的问题,在Unicode中,127个字符的低位(0..)会发生什么(什么都不会发生)。它回答了一个不同的问题(高#128..255个字符会发生什么情况),这个问题不太明显并且经常被误解。@Serg,在你的答案中添加一行关于<128个字符的内容,因为它与
{$HIGHCHARUNICODE}
控制的行为有关。事实上,这些信息也应该在Embarcadero的网站上。@Cosmin:完成,尽管我的回答主要不是关于OP的问题。:)我猜你是在问一个不存在的问题。我无法想象转换为Unicode时127个字符会出现什么问题。如果您有问题,请显示代码。@Serg-因此,我可以保留所有数字字符的原样(当然,除了FillChar)。这太棒了。谢谢