如何移植表示为小数的字符?

WeG*_*ars 3 delphi delphi-unicode

如何将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会涉及大量的代码更改吗?

klu*_*udg 6

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

const s1:AnsiString = #200;
const s2:UnicodeString = #200;
Run Code Online (Sandbox Code Playgroud)

取决于{$ 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
Run Code Online (Sandbox Code Playgroud)

Win1251代码页上的#200是'И'.'И'的Unicode代码点是418美元.

另一方面,Unicode#200是'È'.Win1251没有'È'字符,Unicode - > Win1251转换将其转换为'E',所有ANSI代码页的价格为#$ 45.

使用{$ HIGHCHARUNICODE OFF},编译器将#128 ..#255个字符解释为ANSI字符,具体取决于系统代码页,并在必要时将它们转换为unicode代码点.

使用{$ HIGHCHARUNICODE ON},编译器将#128 ..#255个字符解释为Unicode代码点,并在必要时将它们转换为可能丢失的ANSI字符.


更新

我现在看到Nick的文章中的问题代码在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;
Run Code Online (Sandbox Code Playgroud)

但这是错误的FillChar程序使用的一个例子; FillChar用字节填充desination缓冲区(BTW只是上例中Buf的前半部分)并忽略所有新的Unicode工作人员.FillChar最好现在由FillBytes重命名,禁止使用字符(#9)作为第三个参数.