gpt4 book ai didi

delphi - 如何移植以小数表示的字符?

转载 作者:行者123 更新时间:2023-12-03 15:48:56 26 4
gpt4 key购买 nike

如何将 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com