- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我读到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 字符串类型,您可以丢失原始数据。
您在移动设备(和其他平台)上可以安全使用的字符串类型是string
、UTF8String
和 < 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;
当您在可能发生数据丢失的位置之间进行不安全的类型转换时,Delphi 编译器会发出警告,谨慎的做法是使用其他一些字符串类型来修复所有这些代码。
W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'
当您直接在 UTF-8 和 UTF-16 字符串类型之间转换时也会出现警告,但要清除这些警告,您只需显式类型转换为 string
或 UTF8String
类型,因为编译器会在后台进行适当的转换,所有信息都将保留(注意:Unicode 规范化可能会在该过程中发生)。
W1057 Implicit string cast from 'string' to 'UTF8String'
关于delphi - 我们可以在 Sydney 的手机中安全地使用 ansiString 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66682449/
就我的目的而言,我实际上真正使用的是 ASCII 字符数据(用于向州提交 ASCII 文本文件),因此仅使用 unicodestring 对最终结果没有帮助(我仍然需要转换一些内容)。 我可以选择在
我正在使用 C++ Builder XE3,我遇到了一个关于 AnsiString 的奇怪问题。 看看下面的代码 //Code 1: first time AnsiString temp1 = "te
我想将用户选择的目录路径复制到标签(C++ Bulder 6.0) Label->Caption=SelectDirectory("Select a folder:", "", RootDir); 但
我有一些代码可以在 D7 中正常编译,但在 D2010 中编译失败。显然这是一个 Unicode 问题: 编译错误是:E2251 对“StrPas”的不明确重载调用 整个过程如下: procedure
我创建了以下代码: Function AnsiStringToStream(Const AString: AnsiString): TStream; Begin Result := TString
我这里有一个案例,我要从Delphi 7迁移到delphi 2011 XE,令我惊讶的是,由于ansistrings,许多组件都会出现问题,在delphi xe中它们看起来像日文/中文字符,现在我使用
我正在准备 Delphi 2007 项目的某些部分,以便轻松迁移到 Delphi XE7。 我已经从 string 切换了事件处理程序的参数类型至AnsiString (此特定事件处理程序必须与 An
将包含转义组合变音标记(如“Fu\u0308rst”)的 Delphi XE AnsiString 转换为友好的 WideString“Fürst”的最佳方法是什么? 我知道这并不总是适用于所有组合,
我正在尝试从我的 CentOS VPS 发送一个 4063 字节的 AMR 文件(仅用于测试) nc IP 45500 \sample.amr', fmCreate); end; procedure
根据 FastMM4,我目前正在处理的 Delphi 程序泄漏了很多字符串。 AnsiStrings 准确地说: 应用程序 (http://sourceforge.net/projects/orwel
我有Delphi 2010。 XXX组件使用File_Path:AnsiString。路径可以用XXX语言编写。如果在Windows设置中设置为非Unicode程序使用XXX语言,则XXX组件可以识别
使用此(测试)代码从 PNG 读取文本块: procedure TForm1.Button1Click(Sender: TObject); var PngVar: TPngImage; n:
我有一个 C DLL,它返回一个指向由 C DLL 管理的 PAnsiChar 字符串的指针。我想复制该字符串,以便可以在 Delphi 端对其进行管理。 如果我将返回的 PAnsiChar 转换为
尝试将项目从 Delphi 2007 迁移到 Delphi XE4。在 Delphi XE4 中将 String 转换为 AnsiString 的最佳方法是什么? 最佳答案 您只需分配它即可: var
我在这里有一个类似的问题:Delphi XE - should I use String or AnsiString? 。在决定在我的(大型)库中使用 ANSI 字符串是正确的之后,我意识到我实际上可
在过去,我有一个函数可以转换 WideString到 AnsiString指定代码页的: function WideStringToString(const Source: WideString; C
对于 dapper,我需要构建对传递 AnsiString 参数的支持。 数据库有 unicode 和非 unicode 字符串,选择正确的参数类型有时很重要。 DbType.String 与 DbT
我正在尝试从以下答案中导入代码:Get full running process list ( Visual C++ ) bool FindRunningProcess(AnsiString proc
我在数据库中使用 Dapper,其中字符串主要存储在 VarChar 列中。默认情况下,Dapper 在生成查询时使用 NVarChar 参数,虽然我可以用 DbString 包装我使用的每个字符串参
令我烦恼的是转换。我正在使用 C++ Rad Studio XE8(不要问我为什么必须这样做)。 我有变量 AnsiString a = "D8"; char sz; 我希望 sz 看起来像这样 ch
我是一名优秀的程序员,十分优秀!