delphi NativeXml的中文支持 乱码

摘要:
如果要让NativeXml能够解析widestring字符串的话,直接将TNativeXml的Utf8Encoded属性设置为True。如下:FXmlDoc:=TNativeXml.Create;FXmlDoc.Utf8Encoded:=True;这样NativeXml内部会自动对Widestring和utf8做转换。sdUnicodeToUtf8转换函数NativeXml.pas内置。如下:FXmlDoc.ReadFromString;3.使用ValueAsWidestring、FromWidestring通过使用Node.ValueAsWidestring可以读取、写入widestring类型的节点值。如下:procedureAddNode;beginwithADoc.RootdowithNodeNewdoValueAsWidestring:=AValue;end;4.保存到文件将包含中文的XML文档保存到文件,最重要一点是设置ExternalEncoding属性。

一般XML的编码格式设置成UTF8比较通用,下面演示使用UTF8编码方式存储和处理包含中文的XML字符串(文件)。1.设置启用内置的widestring支持
NativeXml内部使用ANSI string和UTF8编码的string两种字符串类型。如果要让NativeXml能够解析widestring字符串的话,直接将TNativeXml的Utf8Encoded属性设置为True。如下:
FXmlDoc:= TNativeXml.Create;
FXmlDoc.Utf8Encoded:= True;
这样NativeXml内部会自动对Widestring和utf8做转换。此处需要注意的是,如果执行FXmlDoc.Clear
以后再次加载Xml字符串的话,需要重新设置Utf8Encoded属性为True,加载文件或流之前同样需要设置。
2.加载widestring字符串
mmoText 是Tnt Unicode控件Text值为Widestring类型,这里要手动将Widestring转换成utf8编码的string,然后调用 ReadFromString方法加载。sdUnicodeToUtf8转换函数NativeXml.pas内置。如下:
FXmlDoc.ReadFromString(sdUnicodeToUtf8(mmoText.Text));
3.使用ValueAsWidestring、FromWidestring
通过使用Node.ValueAsWidestring可以读取、写入widestring类型的节点值。节点其他属性可以使用FromWidestring方法转换widestring类型到utf8 string。如下:
procedure AddNode(ADoc: TXmlDocument; AName, AValue: widestring);
begin
with ADoc.Root do
with NodeNew(FromWidestring(AName)) do
ValueAsWidestring := AValue;
end;
4.保存到文件
将包含中文的XML文档保存到文件,最重要一点是设置ExternalEncoding属性。ExternalEncoding详细设置参考Help。这里以utf8为例:
FXmlDoc.VersionString:= '1.0′;
FXmlDoc.EncodingString:= 'UTF-8′;
FXmlDoc.ExternalEncoding:= seUTF8;
FXmlDoc.SaveToFile(’C:Test.xml’);
如果是非中文操作系统,不能直接使用SaveToFile保存文件到含有中文的路径,解决方法是先创建一个TTntFileStream文件流然后使用SaveToStream保存。
var
lFS: TTntFileStream;
begin
if dlgSave.Execute then
begin FXmlDoc.VersionString:= '1.0';
FXmlDoc.EncodingString:= 'UTF-8';
FXmlDoc.ExternalEncoding:= seUTF8;
lFS:= TTntFileStream.Create(dlgSave.FileName, fmCreate or fmShareDenyNone);
try
FXmlDoc.SaveToStream(lFS);
finally
lFS.Free;
end;
end;
end;

5.如果xml是utf-8 格式的

NativeXml.WriteToString是乱码,解决方法如下:

Utf8ToAnsi(NativeXml.WriteToString)

免责声明:文章转载自《delphi NativeXml的中文支持 乱码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇.NET通用基本权限系统python操作excel向同一sheet循环追加数据下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SQL Server中将多行数据拼接为一行数据(一个字符串)

SQLServer中将多行数据拼接为一行数据(一个字符串) 方法一: 使用T-SQL DECLARE @Users NVARCHAR(MAX) SET @Users = '' SELECT @Users = @Users + ',' + UserName FROM dbo.[User] WHERE RoleID = 1 SELECT @Users 转载...

Delphi XE5教程2:程序组织

内容源自Delphi XE5 UPDATE 2官方帮助《Delphi Reference》,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者可QQ:34484690@qq.com   1 Program Organization 1         程序组织 Delphi programs are usuall...

配置Tomcat的server.xml编码为UTF-8时,再次发布项目,编码自动还原问题?

当我们在处理中文乱码或是配置数据源时,我们要修改Tomcat下的server.xml 但是当我们修改完后重启Tomcat服务器时发现xml文件又被还原了,修改无效果。 为什么会还原? Tomcat服务器在Eclipse中启动时,会自动发布Eclipse中部署的项目,但是我的项目是自己手动在外面部署的,Eclipse只认得在它里面部署的项目,因此它会创建一个...

Delphi中正常窗口的实现

转自http://blog.csdn.net/cathyeagle1 引言用Delphi所提供的VCL类库编写的Windows应用程序,有一个明显不同于标准Windows窗口的特点--主窗口的系统菜单与任务栏上的系统菜单不相同。一般情况下,主窗口的系统菜单有六个菜单项而任务栏系统菜单只有三个菜单项。实际使用中我们发现用VCL开发的程序有以下几个方面的尴尬:...

Delphi的类与继承

     既然已经做出了com程序用delphi来开发的决定,那当然就要对delphi进行一些深入的了解。有人说delphi是一个用控件堆砌起来的工具,和vb没什么两样;也有人说dephi实际上是面向过程的,他的面向对象并不彻底。实际生活中持这两种观点的人不在少数,就拿我认识的一个非常好的程序员来说吧,他很早就开始用vb,到后来接触到delphi,并且用d...

Delphi中的ObjectList简单用法一则

最近项目中需要搞很多个同一类对象的管理和操作,我居然还想用数组array来实现。在当当的教育下,开始研究TObjectList。Delphi中将一系列对象进行数组形式的维护,TObjectList是一个不错的实现方法。他帮助我们添加、计数、删除、释放一个List列表中的内容。基本实现不难,自己做一个类,把对象数组像List一样封装到Items中去,然后根据...