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

标签 delphi unicode

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

相关文章:

python - python unicode 编码/解码函数的异常(为什么 errors=ignore 实际上不忽略它们??)

delphi - 最初为什么创建 TDataSource?

c# - 使用 C# 从 Delphi DLL 中检索记录数组

php - Mysql 的 Unicode 字符

ios - 在 iOS 上显示基于 Unicode 的五位数埃及象形文字字体的代码是什么?

html - 如何仅使用 css 显示简单的图标

delphi - 如何在TCL中使用Delphi编译的DLL?

Delphi XE2、Intraweb 2.1.23 和 cookie

delphi - 如何找到 TScrollBox 的实际大小 ("logical area")

jsf - 通过 PrimeFaces 输入组件检索的 Unicode 输入已损坏