处理Delphi版本中的Unicode字符串< = 2007 [英] Handling a Unicode String in Delphi Versions <= 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屋!