代码之家  ›  专栏  ›  技术社区  ›  jamiei

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

  •  9
  • jamiei  · 技术社区  · 16 年前

    背景:

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

    5 回复  |  直到 16 年前
        1
  •  29
  •   Rob Kennedy    16 年前

    Delphi 2009之前的Delphi版本 内置Unicode支持。这个 WideString 宽弦 没有新的那么好 UnicodeString 类型,但它仍然包含16位Unicode字符,您可以将其类型转换为 PWideChar Windows 单元声明了大多数API函数的“广泛”版本,并且如果您发现缺少一些函数,并没有什么可以阻止您自己声明其他函数。

    以前的版本在VCL中没有Unicode支持。为此,您可以使用 Tnt Unicode控件 . 他们过去是自由的。看起来有几个地方仍然提供最新的免费版本: (1) , (2)

    JCL 有两个单元用于使用Unicode。这个 JclWideStrings JclUnicode 该单元更加完整,但它还包括一个用于确定所有Unicode字符的字符属性的相当大的资源。

    宽弦 价值观我认为Delphi 7甚至为此提供了一个类。

    如果你有 宽弦 值,并将其编码为UTF-8,然后调用 Utf8Encode 作用它将返回一个 AnsiString Utf8String ,如果您的Delphi版本声明了该类型。这和德尔福2009的不一样 不过,还是要打字。德尔福2009的遗嘱 自动地 破坏 AnsiString(x) 在赋值语句中,反之亦然。以前的版本只有一个 类型,所以您需要自己跟踪哪些变量保存UTF-8数据,哪些保存Ansi数据。(变量和参数名上的匈牙利符号可以帮助您跟踪。)当然,还有 Utf8Decode 用于将UTF-8数据转换回 宽弦 .

    Open XML ,一个免费的Delphi XML库。作为XML处理的一部分,它支持在70种不同编码之间进行转换。

        2
  •  6
  •   Mohammed Nasman    16 年前

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

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

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

    3. 我用不同的语言设置了一个VM,所以我可以在不支持我的语言的不同系统中测试版本。

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

    我也用过 DIConverters 根据Delphi的灵感,使用其函数将数据库从ansi转换为UTI8,您可以使用它进行从/到UTF8的转换,并且它是免费软件;-)

    还有一个开源项目 Delphi fundamentals ,具有unicode的有用功能。

        3
  •  6
  •   Marcus Müller    9 年前

    宽弦

    不要使用字符串类型 不要使用Ansi函数——如果这样做,就会丢失信息。

        4
  •  5
  •   Steve    16 年前

    1. 首先,确保数据库处理unicode字符串。最好是UTF-16支持。确保所有数据库代码正确处理宽字符串,并且正在使用的驱动程序也可以处理此宽字符串。
    2. 最后一部分是将标准和第三方可视组件更改为WideString等同物。这需要在显示可能包含unicode字符的字符串的地方进行。

    最重要的是,确保您的测试是彻底的,并使用实际使用高字节的unicode字符。如果您只是使用拉丁字符集进行测试,您将错过错误。

        5
  •  3
  •   mghie    16 年前

    如果您需要做的只是将程序内部字符串从系统编码转换为UTF-8,然后再转换回UTF-8,那么使用Uwe Raabe提到的库函数。如果您仍然使用Delphi4或Delphi5(它们没有这些函数),则可以使用中的函数 GNU gettext for Delphi .

    不要让关于完全宽边字符串的所有答案吓到你——使用UTF-8作为数据交换的编码(这就是我对你的问题的理解)在正常的Ansi Delphi程序中应该是可能的,没有大问题,只要你处理的数据在Windows编码中是100%可表示的。