一般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)

最新文章

  1. spring mvc Error instantiating class ** with invalid types () or values (). Cause: java.lang.NoSuchMethodException:
  2. P235 实战练习(集合类)
  3. CodeFirstMigrations更新数据库结构(EF数据迁移)
  4. Python深拷贝和浅拷贝
  5. 【Python】一个python实例:给重要的文件创建备份.摘自crossin-python简明教程
  6. Android--应用开发1(应用程序框架)
  7. ☀【SeaJS】SeaJS Grunt构建
  8. 字符串匹配—KMP 扩展KMP Manacher
  9. 快速了解Hibernate的使用
  10. poj_2115C Looooops(模线性方程)
  11. 前端框架Vue入门
  12. Python+Selenium学习--启动及关闭浏览器
  13. java提供类与cglib包实现动态代理
  14. Java常用的类 包 接口
  15. 01Jenkins环境准备
  16. 设计模式之Composite
  17. HDU 5793 A Boring Question (找规律 : 快速幂+乘法逆元)
  18. javascript总结28 :匿名函数
  19. AOP切点切面内容
  20. RGB向yuv的转化最优算法,快得让你吃惊!

热门文章

  1. <thead>
  2. widows sever2003 PHP环境搭建
  3. 自定义Window 服务
  4. Android layout的横竖屏处理
  5. listActivity和ExpandableListActivity的简单用法
  6. oracle 报错 :ORA-04052、 ORA-00604、 ORA-03106、 ORA-02063
  7. [转]Delphi I/O Errors
  8. java通过移位转16进制
  9. POJ2104 K-th Number 静态区间第k最值 平方分割
  10. DOS命令行使用pscp实现远程文件和文件夹传输(转)