[英]Handling a Unicode String in Delphi Versions <= 2007
背景:这个问题涉及2009年以下的Delphi版本(即没有内置的Unicode支持)。 我有一个规范,要求我通过TCP连接传输Unicode编码的字符串,但我没有Delphi 2009。
问题是否有单个函数或非常小的库(我不需要太大的批量),我可以使用它在发送电报之前立即将单个字符串编码为UTF-8? 作为我的问题的第二部分:如果有UTF-8编码的字符串作为响应被发回,我想我将需要另一个函数将其恢复为Delphi字符串格式。 我以这种方式理解这种Unicode支持的局限性。
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将在赋值语句中自动转换为UnicodeString
或AnsiString(x)
,反之亦然。 以前的版本只有一个AnsiString
类型,因此您需要自己跟踪哪些变量包含UTF-8数据以及哪些变量包含Ansi数据。 (关于变量和参数名称的匈牙利表示法可以帮助您跟踪。)当然,还有一个Utf8Decode
函数可以将UTF-8数据转换回WideString
。
要处理其他字符编码,您需要查看Open XML ,这是一个免费的Delphi XML库。 作为XML处理的一部分,它支持转换70种不同的编码。
从UTF8使用类型WideString的和编码功能到/(UTF8Encode / UTF8Decode)
不要使用字符串类型 ,也不要使用Ansi函数 - 如果这样做,就会丢失信息。
我没有使用Delphi 2009(在它发布之前)构建了一个完整的unicode应用程序。
我使用了以下内容:
使用widestring作为主字符串数据类型。
使用unicode的已使用的数据库组件(ADO也使用宽字符串,但我没有'使用它因为它不处理unicode字段名称)。
用于UI的免费TNTControls,工作正常,但它与标准控件相同,没有像其他第三方控件那样的功能。
我已经设置了一个具有不同语言的VM,因此我可以在不支持我的语言的不同系统中测试该版本。
FastReport是我的报告工具,也支持Unicode。
我也使用Delphi Inspiration的DIConverters将数据库从ansi转换为UTI8的功能,你可以用它来转换/转换到UTF8,它是免费软件;-)
还有一个开源项目Delphi基础 ,它有unicode的usefual功能。
但我认为,如果您可以使用D2009获得完全支持unicode,那么您的工作将更容易,更快,因为您不会使用慢速宽带数据类型,并且您会发现大多数第三方提供了Unicode版本或现在正在使用它。
将Delphi 2009之前的应用程序转换为unicode很困难但可行。 我把它分成3个任务。
最重要的是确保您的测试彻底,并使用实际使用高字节的unicode字符。 如果您只是使用拉丁字符集测试,您将错过错误。
如果您需要做的只是将程序内部字符串从系统编码转换为UTF-8并返回,那么请使用Uwe Raabe提到的库函数。 如果你仍然使用Delphi 4或5(没有这些功能),你可以使用Delphi的GNU gettext中的函数。
并且不要让所有关于完全使用WideString的答案吓到你 - 使用UTF-8作为数据交换的编码(这是我理解你的问题)应该可以在正常的Ansi Delphi程序中实现而不会出现大问题,只要您正在处理Windows编码中100%可表示的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.