当前位置:  开发笔记 > Android > 正文

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

如何解决《在Delphi版本中处理Unicode字符串<=2007》经验,为你挑选了4个好方法。

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

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



1> Rob Kennedy..:

Delphi 2009之前的Delphi版本确实内置了Unicode支持.这个WideString类型自Delphi 4以来就已经可用,我想,也许更早.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种不同的编码.


在Delphi 2009之前,如果将WideString分配给String,您将拥有从Unicode到string = AnsiString的自动转换,以及该进程的当前代码页.如果要使用UTF-8而不是当前代码页进行sintr存储,则必须使用Utf8Decode/Utf8Encode.

2> Bernd Ott..:

使用类型WideString的从UTF8和编码功能到/(UTF8Encode/UTF8Decode)

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



3> Mohammed Nas..:

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

我使用了以下内容:

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

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

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

    我已经设置了一个具有不同语言的VM,因此我可以在不支持我的语言的不同系统中测试该版本.

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

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

还有一个开源项目Delphi基础,它有unicode的usefual功能.

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



4> Steve..:

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

    首先,确保您的数据库处理unicode字符串.最好是UTF-16支持.确保所有数据库代码都正确处理宽字符串,并且您使用的驱动程序也可以正常处理.

    将所有业务逻辑从使用字符串转换为使用WideStrings.很容易错过一些,你不会得到任何错误,因为如果忘记任何方法,编译器将隐式地将宽字符串转换为字符串.还要确保将所有标准字符串函数更改为WideString等效函数.此过程需要扩展到您可能使用的任何第三部分组件.

    最后一部分是将您可能拥有的标准和第三方可视组件更改为WideString等效组件.这需要在显示可能包含unicode字符的字符串的地方完成.

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

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有