如何将 Delphi 7 中以小数表示的字符(#0、#1、#9、#10、#13、#32、#128、#255)移植到 Delphi Unicode?某些文档(例如来自 Embarcadero 的“Delphi in a Unicode world”)仅表示应将它们替换为实际字符。例如,我应该使用“€”而不是#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 代码页上是“И”。 “И”的 Unicode 代码点是 $418。
另一方面,在 Unicode #200 中是“È”。 Win1251 没有“È”字符,Unicode -> Win1251 转换会将其转换为“E”,这对于所有 ANSI 代码页来说是 #$45。
使用 {$HIGHCHARUNICODE OFF},编译器根据系统代码页将 #128..#255 字符解释为 ANSI 字符,并在必要时将它们转换为 unicode 代码点。
使用 {$HIGHCHARUNICODE ON},编译器会将 #128..#255 字符解释为 Unicode 代码点,并在必要时将它们转换为 ANSI 字符,但可能会丢失。
<小时/>更新
我现在看到来自 Nick's article 的问题代码在 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) 作为第三个参数。
关于delphi - 如何移植以小数表示的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6184804/