首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi idhttp断字符

Delphi idhttp断字符
EN

Stack Overflow用户
提问于 2015-02-06 03:31:14
回答 1查看 838关注 0票数 0

我正在研究Delphi,并使用IDHTTP从服务器获取XE5。获取XML可以正常工作,但也有一些字符损坏。角色是‘·’(子弹点)。其他人都很好,但子弹点断了。

我创建了IDHTTP,如下所示:

代码语言:javascript
复制
idhttps := TIdHTTP.Create();
idhttps.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
idhttps.IOHandler.DefStringEncoding := IndyTextEncoding(TEncoding.UTF8);
idhttps.HandleRedirects := True;
idhttps.ConnectTimeout := 5000;
idhttps.Request.USERNAME := 'USERNAME';
idhttps.Request.PASSWORD := 'PASSWORD';
idhttps.Request.BasicAuthentication := True;
idhttps.Request.Accept := 'text/xml';

然后获得如下所示的xml:

代码语言:javascript
复制
SS := TStringStream.Create('', TEncoding.UTF8);

try
  self.GetIdHTTPForLexicomp.Get(URL, SS);
  XMLDoc := TXMLDocument.Create(nil);
  XMLDoc.LoadFromStream(SS, TXMLEncodingType.xetUTF_8Like);
finally
  SS.Free;
end;

在XML中,要点显示如下所示:

?过敏反应/过敏反应:可能引起过敏反应,

XML报头如下:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

我该查些什么?

XML :我添加了片段。它需要一个XSL文件作为样式,但在本例中,我认为这不是一个问题。“?”是破碎的性格。

代码语言:javascript
复制
<?xml version="1.0" standalone="yes"?>
<ns2:monogragh>
  <monograghFields>
    <field fieldId="234837" fieldTypeCode="war" created="2005-04-07T17:28:33Z" modified="2014-10-02T11:32:57Z" sectionId="0">
      <fieldName>Warnings/Precautions</fieldName>
      <content>
        <div id="war" class="block">
          <p style="text-indent:-2em;margin-left:2em;text-align:justify;">
            <b>
              <i>Concerns related to adverse effects:</i>
            </b>
          </p>
          <p style="text-indent:-2em;margin-left:4em;text-align:justify;">
            ? Anaphylaxis/hypersensitivity: May cause hypersensitivity reactions, including anaphylaxis; use with caution in patients with anaphylactic disorders.
          </p>
        </div>
      </content>
    </field>
  </monograghFields>
</ns2:monogragh>

看来我提供了错误的信息。我附上了捕获的xml片段。第一个是使用rest客户端工具从浏览器获得的结果,最后一个是通过idhttp获得xml的结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-06 04:34:14

  1. 使用IOHandler.DefStringEncoding时不要设置TIdHTTP属性。让TIdHTTP以自己的方式处理编码。
  2. 使用TStream接收XML是正确的选择。但是,特别是使用TStringStream并不是一个好的选择,因为它绑定到您在构造函数中指定的TEncoding。如果XML没有被编码在TEncoding实现的同一个字符集中,那么XML就不会被正确地解码。使用TMemoryStreamTBytesStream代替,以保持原来的XML字节原样。
  3. 在编码方面,XML是自我描述的.不要告诉TXMLDocument它应该使用什么编码,让TXMLDocument本身告诉TXMLDocument要使用哪种编码。

试试这个:

代码语言:javascript
复制
idhttps := TIdHTTP.Create();
idhttps.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(idhttps);
idhttps.HandleRedirects := True;
idhttps.ConnectTimeout := 5000;
idhttps.Request.USERNAME := 'USERNAME';
idhttps.Request.PASSWORD := 'PASSWORD';
idhttps.Request.BasicAuthentication := True;
idhttps.Request.Accept := 'text/xml';

代码语言:javascript
复制
MS := TMemoryStream.Create;
try
  idhttps.Get(URL, MS);
  MS.Position := 0;
  XMLDoc := TXMLDocument.Create(nil); // XMLDoc must be IXMLDocument, or a memory leak occurs
  XMLDoc.LoadFromStream(MS);
finally
  MS.Free;
end;

现在,TXMLDocument应该解析服务器实际发送的原始字节,而无需事先由TIdHTTP或RTL进行任何解释。

如果仍然存在相同的问题,那么XML本身一开始就没有正确编码,或者在将XML加载到TXMLDocument之后没有正确地处理/显示XML。这两个问题你都还没有展示出来,所以我们只能猜测你的实际问题在哪里,超出了我上面提到的范围。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28358125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档