处理Delphi版本中的Unicode字符串< = 2007 [英] Handling a Unicode String in Delphi Versions <= 2007

查看:157
本文介绍了处理Delphi版本中的Unicode字符串< = 2007的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Background: This question relates to versions of Delphi below 2009 (ie without Unicode support built in). I have a specification that requires me to transmit a Unicode encoded string over a TCP connection but I do not have Delphi 2009.

问题是否一个单一的功能或非常小的库(我不需要太多的批量),我可以用来将单个字符串编码为UTF-8,然后发送通过电线?作为我的问题的第二部分:如果有UTF-8编码的字符串作为响应发送回来,我想我将需要另一个函数将其恢复为Delphi字符串格式。我以这种方式了解这种Unicode支持的局限性。

Question Is there a single function or very small library (I don't need too much bulk) that I can use to encode a single string into UTF-8 immediately prior sending over the wire? As a second part of my question: if there are UTF-8 encoded strings being sent back as a response, I guess I would then need another function to get it back into a Delphi string format. I understand the limitations of such Unicode support in this way.

推荐答案

Delphi 2009之前的Delphi版本 >内置Unicode支持。从Delphi 4开始, WideString 类型已经可用,也许更早。 WideString 不如新的 UnicodeString 类型,但它仍然保存16位Unicode字符,而你可以将其转换为 PWideChar 将字符串发送到Unicode API函数。 Windows 单位声明了大部分广泛版本的API函数,如果您发现某些缺失,那么您无需阻止您自己声明其他函数。

Delphi versions prior to Delphi 2009 do have Unicode support built in. The WideString type has been available since Delphi 4, I think, maybe earlier. WideString isn't as nice as the new UnicodeString type, but it still holds 16-bit Unicode characters, and you can type-cast it to PWideChar to send strings to Unicode API functions. The Windows unit declares most of the "wide" versions of the API functions, and there's nothing to stop you from declaring other functions yourself if you find some missing.

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

What prior versions don't have is Unicode support in the VCL. For that, you can use the Tnt Unicode controls. They used to be free. Looks like there are a few places where the latest free version is still available: (1), (2).

JCL 有几个使用Unicode的单位。 JclWideStrings 单元主要具有轻量级的功能。 JclUnicode 单元更完整,但它还包含一个确定所有Unicode字符的字符属性的大量资源。

The JCL has a couple of units for working with Unicode. The JclWideStrings unit has mostly light-weight utility functions. The JclUnicode unit is more complete, but it also includes a sizable resource for determining character properties of all Unicode characters.

使用JCL,您可以选择几个类来容纳 WideString 值的列表。我认为Delphi 7甚至会有一个类。

With the JCL you have a few choices for classes to hold lists of WideString values. I think Delphi 7 even comes with a class for that.

不要以为只是因为你没有Delphi 2009,你不能编写一个Unicode程序。

Don't think that just because you don't have Delphi 2009 you can't write a Unicode program.

如果您有一个 WideString 值,并且要将其编码为UTF-8,请调用 Utf8Encode 功能。如果您的Delphi版本声明该类型,它将返回 AnsiString 值,或可能 Utf8String 。但是,与Delphi 2009的 Utf8String 类型不同。 Delphi 2009的将自动转换为 UnicodeString AnsiString(x),反之亦然声明以前的版本只有一个 AnsiString 类型,所以您需要跟踪自己哪些变量保存UTF-8数据,哪些保存Ansi数据。 (您的变量和参数名称的匈牙利符号可以帮助您跟踪。)当然,还有一个 Utf8Decode 转换UTF-8数据返回到 WideString

If you have a WideString value, and you want to encode it as UTF-8, then call the Utf8Encode function. It will return an AnsiString value, or possibly Utf8String, if your Delphi version declares that type. It's not the same as Delphi 2009's Utf8String type, though. Delphi 2009's will automatically convert to UnicodeString or AnsiString(x) and vice versa in assignment statements. Prior versions just have a single AnsiString type, so you need to keep track for yourself which variables hold UTF-8 data and which hold Ansi data. (Hungarian notation on your variable and parameter names can help you keep track.) And of course, there's also a Utf8Decode function for converting UTF-8 data back to WideString.

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

For handling other character encodings, you want to check out Open XML, a free XML library for Delphi. As part of its XML handling, it has support for converting between 70 different encodings.

这篇关于处理Delphi版本中的Unicode字符串< = 2007的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆