我用.net(c#)写了个webservice,想用delphi调用,但是出现了错误;
错误如下:Project PrjQueue.exe raised exception class EdomparseError with message'无效的unicode字符' Line 1 :<?xml version="1.0" encode="utf-8"?><s',...>
那位大侠知道怎么回事?谢了

解决方案 »

  1.   

    现在好了,在一台机器上不行,换了一台,好了.
    但是现在又有一个问题:delphi共有2个函数调用webservice,其中一个返回汉字,但是返回得到的却是一些编码,怎么才能转换成汉字呢(delphi中)?
      

  2.   

    function UTF8Decode(const S: UTF8String): WideString;
    function UTF8Encode(const WS: WideString): UTF8String;参看以下程序  。看一下你得到的是什么形式,XML用utf8编码。所以的转化一下
    var
      AStr: string;
      AWideStr: WideString;
    begin
     ADOQuery1.Open;
     ADOQuery1.SaveToFile('F:\xml_Test\Temp\Share.xml', pfXML);
     ADOQuery1.Close;
     XMLDocument1.LoadFromFile('F:\xml_Test\Temp\Share.xml');
     XMLDocument1.Active := True;
     Memo1.Text := XMLDocument1.XML.Text;
     AWideStr :=UTF8Decode( XMLDocument1.XML.Text);
     Memo2.Text := AWideStr;
     XMLDocument1.Active := False;
     XMLDocument1.XML.Text :=  UTF8Encode(AWideStr);
     Memo3.Text := XMLDocument1.XML.Text;
     XMLDocument1.Active := True;
     XMLDocument1.SaveToFile('F:\xml_Test\Temp\Shard.xml');
     XMLDocument1.Active := False;
      

  3.   

    普通的汉字标准是GB
    在"UTF-16"编码方式中,所有的字符都使用16个二进制位来表示,表示的从0到65535的字符。在处理使用该编码的文件时,每取出一个字符,需要从该文件中得到两字节的数据,按照其默认的高低为顺序,将其组合为一个16位的数值,即为该字符的数值。
    "UTF-8"编码方式中,表示字符编码的基本单位是一个八位二进制数(一字节)。根据字符在Unicode字符集中的位置,即字符的数值不同,一个字符可能被编码成为一字节,两字节,三字节。具体规定如下:
    从0x0000到0x007f之间的字符(即ASCII码的前128位),使用一字节编码。具体格式为 [0vvvvvvv],该字节的第一位为0,后七位为有效位,表示该字符的数值,这与ASCII码的编码方式相同,无需特殊处理。
    从0x0080到0x07ff之间的字符使用两个字节编码。具体格式为[110vvvvv], [10vvvvvv],第一个字节的开始三位为110,其后为有效位,第二个字节的开始两位为10,有六个有效位。处理时需要将此两个字节的有效位取出,合成一个十一位的二进制数,即为该字符的数值。
    从0x0800到0xffff之间的字符使用三个字节编码,具体格式为 [1110vvvv], [10vvvvvv], [10vvvvvv]。 此三个字节的有效位分别为4,6,6,处理时应把他们合并成16位的数值。
      

  4.   

    谢谢大家;
    现在的问题越来越怪,我的机器的操作系统是xp的,另一台为2000的;如果用delphi调用我的机器上的webservice那么会出现错误(如标题);
    在2000操作系统上的机器再布署webservice,用delphi调用它就可以,也不报错;是不是我机器的操作系统设置有什么不对.
      

  5.   

    我在.net上设置了断点,进行调试,发现返回的xml串也是正确的,就是在delphi调用此函数返回时报出如标题的错误。
      

  6.   

    解决了,用c#调用oracle的存储过程,返回的值,如果有空格之类的,delphi调用时就无法解析xml文件,报这个错误.谢谢大家参与,我尽早结帖.
      

  7.   

    粗一看,还以为是Delphi能识别C#中的DataSet或DataTable包了呢  ^_^