gpt4 book ai didi

delphi - 我们可以在 Sydney 的手机中安全地使用 ansiString 吗?

转载 作者:行者123 更新时间:2023-12-05 08:48:00 25 4
gpt4 key购买 nike

当我读到Migrating Delphi Code to Mobile from Desktop ,他们说要避免使用 AnsiString。有什么理由吗? AnsiString 使用的内存比 UnicodeString 少 2 倍,它是 JSON 的完美容器。那么,我可以安全地使用 AnsiString,还是需要继续使用 UnicodeString(以及为什么)?

最佳答案

您可以在移动平台上使用 8 位字符串。但安全性取决于您使用的是哪种 8 位字符串。

对于 Windows 以外的任何系统,甚至在 Windows 上,使用 AnsiString 都是非常糟糕的主意。 AnsiString 是遗留类型,虽然它在 10.4 中在移动平台上重新启用,但这并不意味着您应该使用它,更不意味着您可以安全地使用它。

AnsiString 的一个问题是迟早会在您的代码中进行转换,因为整个 RTL 和 FMX 使用的默认字符串类型是 UTF-16 字符串类型,您可以丢失原始数据。

您在移动设备(和其他平台)上可以安全使用的字符串类型是stringUTF8String 和 < strong>RawByteString.

当谈到 RawByteString 时,它只能安全​​地用于代码页不可知的操作。查看更多:Delphi XE - RawByteString vs AnsiString

JSON 文件不支持 ANSI 编码,因此 Unicode 是您唯一的选择。 UTF-8 和 UTF8String 会做得更好,因为这也是任何 JSON 数据交换的默认编码。

就各种 AnsiXXX 函数而言,最好的选择是编写您自己的适用于 UTF-8 字符串的例程。您还可以使用适用于通用字符串类型的标准函数,但由于要转换为 UTF-16 并返回,它们速度较慢。


在移动设备(Android)上使用AnsiString时数据丢失的说明

Android 规范只要求实现几个标准字符集。这包括 ISO-8859-1

https://developer.android.com/reference/java/nio/charset/Charset

对于您依赖于特定设备的任何其他内容。

例如,下面的示例使用 AnsiString 可以很好地处理法语字符集,但无法处理克罗地亚语和中文。

var
s: string;
u: UTF8String;
a: AnsiString;
begin
s := 'é à è ù â ê î ô û ç ë ï ü';
a := s;
u := s;
Memo1.Lines.Add(s);
Memo1.Lines.Add(u);
Memo1.Lines.Add(a);

s := 'š đ č ć ž Š Đ Č Ć Ž';
a := s;
u := s;
Memo1.Lines.Add(s);
Memo1.Lines.Add(u);
Memo1.Lines.Add(a);

s := '新年';
u := s;
a := s;
Memo1.Lines.Add(s);
Memo1.Lines.Add(u);
Memo1.Lines.Add(a);
end;

different character encodings displayed on Android device

当您在可能发生数据丢失的位置之间进行不安全的类型转换时,Delphi 编译器会发出警告,谨慎的做法是使用其他一些字符串类型来修复所有这些代码。

W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'

当您直接在 UTF-8 和 UTF-16 字符串类型之间转换时也会出现警告,但要清除这些警告,您只需显式类型转换为 stringUTF8String 类型,因为编译器会在后台进行适当的转换,所有信息都将保留(注意:Unicode 规范化可能会在该过程中发生)。

W1057 Implicit string cast from 'string' to 'UTF8String'

关于delphi - 我们可以在 Sydney 的手机中安全地使用 ansiString 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66682449/

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