【问题标题】:Handling of UTF-16 string data type in Delphi XE (best practice)Delphi XE 中处理 UTF-16 字符串数据类型(最佳实践)
【发布时间】:2014-01-07 17:22:33
【问题描述】:

关于 Unicode 的信息太多了,但我很难得出结论。

我正在开发一个多语言的 Delphi XE5 应用程序,现在我遇到了这个 unicode 字符的问题。老实说,我不想了解背后的魔力,我只想看到它们在我的应用程序中工作。

以前很简单。一般使用String数据类型。现在我读到了WideStringUnicodeStringAnsiString 以及 XE5 中的 String 与 UTF-16 兼容的事实

我已经用WideString 进行了测试,并且像 (șțăîâ) 这样的后期字符正在工作,但仍然不清楚 WideString 是否是最好的字符。我应该使用UnicodeString 还是其他?

那么,如果我要做一个支持所有语言的多语言应用程序,到底应该使用什么样的数据类型?是否有可能保持String 类型并获得与WideString 相同的结果?

备注:我在我的应用程序中使用 FireDac 组件,但这不重要。

【问题讨论】:

标签: delphi unicode utf-16 type-conversion


【解决方案1】:

在现代 Delphi 中,“字符串”是“UnicodeString”真实数据类型的快捷方式。除非不得不强制使用其他类型,否则请使用它。

WideString 只是 Microsoft OLE BSTR 类型的 Delphi 化名,缺乏引用计数。这会禁用写时复制优化,并使这些字符串的工作速度通常比 UnicodeString 慢(数据缓冲区被一次又一次地复制,而不是仅仅将新指针传递给它)。除非您完全需要这些功能 - 最好使用常用字符串。但是对于 i18n 来说,这两种类型都足够了。

【讨论】:

  • 那么为什么使用字符串无法显示 unicode 而使用宽字符串却可以?我应该为我的应用程序设置一些东西吗?
  • 显示代码,可能是较短的示例 (Google sscce),其输入字符正确,但输出字符损坏。一般来说,它只是工作。可能您在不理解的情况下使用了一些过时的库。你使用 XE 还是 XE5?修正您的问题以仅表示正确的版本请求
  • 顺便说一句,你确定你只改变了数据类型而不改变使用的函数,比如调用. AsWideString.AsString,它们是不同的函数,但它们不是变量/数据类型?
  • 我从 MSSQL Express 数据库中读取数据。在那里可以正确看到 unicode 字符。然后,我使用 FireDac 使用我制作的函数从 DB 中读取数据(basiclu 我读为 WideString,因为作为 String 它没有正确显示:matrix[row,col]:=FDQuery1.Fields.Fields[col]。 AsWideString; 然后我把数据放到一个TVirtualStringTree中,为什么String不起作用?
  • 我想我明白你的意思。如果在一个地方我使用 String 而在另一个 WideString 中,那么 String 就不再工作了……我用 String 和 WideString 玩了很多以使其工作,如果在一个地方没有写,那么它就不起作用。如果我理解 wright,一切都必须保存为字符串!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
相关资源
最近更新 更多