【问题标题】:Degree symbol is not displaying correctly in XML file by using TXML Document object in Delphi XE7在 Delphi XE7 中使用 TXML Document 对象在 XML 文件中无法正确显示度数符号
【发布时间】:2015-02-11 06:02:50
【问题描述】:

请参考下面我提供的代码。

****XMLDoc.Active := True;
  XMLDoc.Options := [doNodeAutoCreate, doNodeAutoIndent];
  XMLDoc.Version := '1.0';
  XMLDoc.Encoding := 'utf-8';****

?xml version="1.0" encoding="UTF-8"? 这是我打开 XML 文件时的预期结果。但它没有在 XML 文件中显示 encoding="UTF-8"。因此,我认为度数符号未正确显示在 XML 文件中。(因为它无法编码)。

我将 UTF-8 更改为 UTF-16,但是当我尝试打开 XML 文件时,它显示错误消息,例如 Switch from current encoding to specified encoding not supported。我猜 RAD Studio XE7 中存在一些编码问题,因为对于以前的版本(Delphi XE5)它工作正常。请给我一些建议。

下面我提供示例代码。

XMLDocument1:= TXMLDocument.create(nil);
    XMLDocument1.Active := True;
    XMLDocument1.Version :='1.0';
    XMLDocument1.Encoding :='UTF-8';
        XMLDocument2:= TXMLDocument.create(nil);
    XMLDocument2.Active := True;
    XMLDocument2.Version :='1.0';
    XMLDocument2.Encoding :='UTF-8';          

  { Add new child. This will become the document element.
    If the document element already exists, then an exception is raised. }
  //LNode := XMLDocument1.AddChild('Airbus');
  LNode := XMLDocument1.CreateElement('TestElement', '101°F (38.33°C)');
  XMLDocument1.DocumentElement := LNode;

  { Display document content. }

    XMLDocument1.SaveToFile('c:\mk1.xml');
{if we take xmldocuments.xml.text method is not taking “Encoding=’UTF-8’}
    XMLDocument2.LoadFromFile ('c:\mk1.xml');
    **strsampletext:= XMLDocument2.XML.text; //Here I am not getting "Encoding='UTF-8". and the string "strsampletext" passed as a parameter**. If I write "strsampletext" into another XML file I can't view Degree Symbol correctly when I view in IE.

加载保存的 XML 后,编码的 UTF-8 不取。

【问题讨论】:

  • 你能显示你编写 XML 文件的代码吗?
  • 欢迎来到 Stack Overflow。不仅在这里,生活中无处不在,一个好的问题描述是这样的:“我做了X。我希望看到Y,但是我得到了Z。”到目前为止,您发布的内容根本不包括X,而且您几乎没有接触过YZ。请edit您的问题提供必要的详细信息。
  • 我编辑了问题并提供了必要的详细信息。请给我一些建议。
  • 请提供完整的程序。这里没有人愿意花时间尝试重新创建您的程序。请添加一个小的、精简的完整程序。想象一下,我们还有其他事情要做,并且想帮助您,但要在尽可能短的时间内完成。
  • 我提供了一个示例代码,希望能帮助您理解问题并找到解决方案。

标签: xml delphi utf-8 delphi-xe7


【解决方案1】:

这里没有我可以重现的错误。根据您的代码考虑这个程序:

{$APPTYPE CONSOLE}

uses
  Xml.XMLIntf, Xml.XMLDoc, Winapi.ActiveX;

procedure Main;
var
  XMLDocument1, XMLDocument2: IXMLDocument;
  LNode: IXMLNode;
begin
  XMLDocument1 := TXMLDocument.Create(nil);
  XMLDocument1.Active := True;
  XMLDocument1.Version := '1.0';
  XMLDocument1.Encoding := 'UTF-8';
  XMLDocument2 := TXMLDocument.Create(nil);
  XMLDocument2.Active := True;
  XMLDocument2.Version := '1.0';
  XMLDocument2.Encoding := 'UTF-8';
  LNode := XMLDocument1.CreateElement('TestElement', '101°F (38.33°C)');
  XMLDocument1.DocumentElement := LNode;
  XMLDocument1.SaveToFile('c:\desktop\mk1.xml');
  XMLDocument2.LoadFromFile('c:\desktop\mk1.xml');
  Writeln(XMLDocument2.Encoding);
end;

begin
  CoInitialize(nil);
  Main;
  Readln;
end.

这个程序在XE7 update 1, 32 bit编译时的输出是:

UTF-8

保存的文件使用 UTF-8 编码。这是我加载文件时来自 Notepad++ 的屏幕截图:

请注意,度数符号显示正确,并且已按照您的意图清楚地解释。还要注意窗口右下角报告的编码。正如预期的那样,没有 BOM 的 UTF-8。

您误认为存在问题,而实际上没有问题。


关于您的更新,您现在似乎在询问XML.Text。这是一个 Delphi string,因此它始终被编码为 UTF-16。所有 Delphi 字符串都以这种方式编码。 XML 文档编码在文档被流式传输时应用。因此,当您保存到流或文件时,编码就会发挥作用。

如果您决定自己将 XML 内容保存在 XML 文档对象的后面,那么您需要注意使用写入编码。所以发生在你身上的是你的代码,我们仍然看不到,使用了错误的编码。如果您将XML.Text 保存到编码为 UTF-8 的文件中,那么一切都会好起来的。问题是您使用不同的编码进行保存。您很可能正在使用 ANSI 编码进行保存。

所以也许你的代码是这样运行的:

Memo1.Lines.Text := XMLDocument1.XML.Text;
Memo1.Lines.SaveToFile(...);

这将失败,因为保存 TStrings 时的默认编码是 ANSI。

【讨论】:

  • 感谢您的宝贵时间。但是,当我将 XMLDocument2.XML.Text 写入某个 XML 文件并在 IE 中查看 xml 文件时出现错误时,我遇到了问题。请参考修改后的代码。请尝试在任何浏览器(IE/Chrome)中打开
  • 你已经完全改变了问题!我会更新答案。
猜你喜欢
  • 1970-01-01
  • 2013-03-12
  • 2012-03-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
相关资源
最近更新 更多