在Delphi版本中处理Unicode字符串< = 2007

时间:2008-12-20 10:55:10

标签: delphi unicode encoding

背景:这个问题与2009年以后的Delphi版本有关(即没有内置的Unicode支持)。我有一个规范,要求我通过TCP连接传输Unicode编码的字符串,但我没有Delphi 2009.

问题是否有单个函数或非常小的库(我不需要太大的批量),我可以使用它在通过网络发送之前立即将单个字符串编码为UTF-8?作为我的问题的第二部分:如果有UTF-8编码的字符串作为响应被发回,我想我将需要另一个函数将其恢复为Delphi字符串格式。我以这种方式理解这种Unicode支持的局限性。

5 个答案:

答案 0 :(得分:26)

Delphi 2009之前的Delphi版本内置了Unicode支持。自从Delphi 4以来, WideString 类型可用,我想,可能更早。 WideString不如新UnicodeString类型好,但它仍然包含16位Unicode字符,您可以将其输入 PWideChar 将字符串发送到Unicode API函数。 Windows单元声明了API函数的大多数“宽”版本,如果发现缺少某些函数,则无法阻止您自己声明其他函数。

以前的版本没有VCL中的Unicode支持。为此,您可以使用 Tnt Unicode控件。他们曾经是自由的。看起来有一些地方仍然可以使用最新的免费版本:(1)(2)

JCL有两个用于处理Unicode的单元。 JclWideStrings 单元主要具有轻量级实用功能。 JclUnicode 单元更完整,但它还包含一个相当大的资源,用于确定所有Unicode字符的字符属性。

使用JCL,您可以选择几个类来保存WideString值列表。我认为Delphi 7甚至还有一个类。

不要以为仅仅因为你没有Delphi 2009就无法编写Unicode程序。

如果您有WideString值,并且想要将其编码为UTF-8,请调用 Utf8Encode 功能。如果您的Delphi版本声明该类型,它将返回AnsiString值,或者可能返回Utf8String。但它与Delphi 2009的Utf8String类型不同。在赋值语句中,Delphi 2009将自动转换为UnicodeStringAnsiString(x),反之亦然。以前的版本只有一个AnsiString类型,因此您需要自己跟踪哪些变量包含UTF-8数据以及哪些变量包含Ansi数据。 (关于变量和参数名称的匈牙利表示法可以帮助您跟踪。)当然,还有一个 Utf8Decode 函数,用于将UTF-8数据转换回WideString

要处理其他字符编码,您需要查看Open XML,这是一个免费的Delphi XML库。作为XML处理的一部分,它支持转换70种不同的编码。

答案 1 :(得分:6)

使用类型 widestring 和编码函数来自/来自utf8(UTF8Encode / UTF8Decode)

不要使用字符串类型并且不要使用Ansi函数 - 如果您这样做,则会丢失信息。

答案 2 :(得分:6)

我没有使用Delphi 2009(在它发布之前)构建了一个完整的unicode应用程序。

我使用了以下内容:

  1. 使用widestring作为主字符串数据类型。

  2. 使用unicode支持的已使用数据库组件(ADO也使用宽字符串,但我没有'使用它因为它不处理unicode字段名称。)

  3. 用于UI的免费TNTControls,工作正常但与标准控件相同,没有像其他第三方控件那样的功能。

  4. 我已经设置了一个不同语言的虚拟机,因此我可以在不支持我语言的不同系统中测试该版本。

  5. FastReport是我的报告工具,也支持Unicode。

  6. 我也使用Delphi Inspiration的DIConverters将数据库从ansi转换为UTI8及其功能,你可以用它来转换/转换为UTF8,它是免费软件; - )

    还有一个开源项目Delphi fundamentals,它有unicode的usefual函数。

    但我认为,如果您可以使用D2009获得完全支持unicode,那么您的工作将更容易,更快,因为您不会使用慢速宽带数据类型,并且您会发现大多数第三方提供了Unicode版本或现在正在努力。

答案 3 :(得分:5)

将Delphi 2009之前的应用程序转换为unicode很困难但可行。我把它分成3个任务。

  1. 首先,确保您的数据库处理unicode字符串。最好是UTF-16支持。确保所有数据库代码都正确处理宽字符串,并且您使用的驱动程序也可以正常处理。
  2. 将所有业务逻辑从使用字符串转换为使用WideStrings。很容易错过一些,你不会得到任何错误,因为如果忘记任何方法,编译器将隐式地将宽字符串转换为字符串。还要确保将所有标准字符串函数更改为WideString等效函数。此过程需要扩展到您可能使用的任何第三部分组件。
  3. 最后一部分是将您可能拥有的标准和第三方可视组件更改为WideString等效项。这需要在显示可能包含unicode字符的字符串的地方完成。
  4. 最重要的是确保您的测试彻底,并使用实际使用高字节的unicode字符。如果您只是使用拉丁字符集进行测试,则会错过错误。

答案 4 :(得分:3)

如果您需要做的只是将程序内部字符串从系统编码转换为UTF-8并返回,那么请使用Uwe Raabe提到的库函数。如果您仍在使用Delphi 4或5(没有这些功能),则可以使用GNU gettext for Delphi中的函数。

并且不要让所有关于完全使用WideString的答案吓到你 - 使用UTF-8作为数据交换的编码(这是我理解你的问题的方式)应该可以在正常的Ansi Delphi程序中没有大问题,只要您处理的是Windows编码中100%可表示的数据。