PHP调用.net的webservice 中文乱码解决方案

由于工作的需要,帮我的同事阿韬测试一下.net的webservice在PHP下的应用.于是开始上网找资料,发现很多phper都是用nusoap.于是下载一个回来.用它自带的例子修改一下.可在文章的后面的附件中找到下载地址.
代码如下:

 

<?php
require_once(
'../nusoap/lib/nusoap.php');
$client 
= new soapclient('http://localhost/TestService/Service1.asmx?WSDL'true);
$err 
= $client->getError();
if ($err) {
 echo 
'<h2>Constructor error</h2><pre>' . $err . '</pre>';
}

// Doc/lit parameters get wrapped
$param = array('str' => 'China');
$result 
= $client->call('HelloWorld', array('parameters' => $param), ''''falsetrue,'document','encoded');
// Check for a fault
if ($client->fault) {
 echo 
'<h2>Fault</h2><pre>';
 print_r($result);
 echo 
'</pre>';
}
 else {
 
// Check for errors
 $err = $client->getError();
 
if ($err) {
  
// Display the error
  echo '<h2>Error</h2><pre>' . $err . '</pre>';
 }
 else {
  
// Display the result
  echo '<h2>Result</h2><pre>';
  print_r($result);
  echo 
'</pre>';
 }

}

echo 
'<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo 
'<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
echo 
'<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
?>


如果我的webservice返回的内容中没有中文的话,则很简单就上面的例子就成功了.但是一个新的问题出现了,如果我的webservice中有中文的话,返回的值就变成了乱码.查看了一下response的结果,是正确的.应该是用nusoap处理的时候出现了问题.
由于我没有安装PHP断点调试工具(其实我都不知道有没有这个工具).所以只能一个方法,一个方法看.看了一天,终于看完了,原来还必须指定编码才可以的.如:

 

$client = new soapclient('http://localhost/TestService/Service1.asmx?WSDL'true);
//中间加入以下两行即可
   $client->soap_defencoding = 'UTF-8';
$client
->decode_utf8 = false;


 

posted @ 2005-08-25 10:58 小强(占卜师) 阅读(4851) 评论(17)  编辑 收藏 网摘 所属分类: php

  回复  引用  查看    
#1楼 2005-08-25 11:16 | mikespook      
呵呵,想着就是编码的问题,DOTNET用的是UTF-8,PHP默认是本地编码~~
新闻组上说PHP的UNICODE版已经可以测试了,还没见到真面目~~
  回复  引用    
#2楼 2005-10-11 14:50 | can [未注册用户]
$Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $
我用的这个版本的,但按上述所说的修改"var $soap_defencoding = 'UTF-8';"
还是有问题的.接收到中文时显示"??"的.
  回复  引用  查看    
#3楼 [楼主]2005-10-11 16:24 | coolstr[占卜師oοΟ]      
不好意思哦,有个地方写的时候写错啦。现在已经更正
nusoap.php两个地方就OK了.
更改的地方:
86行的: var $soap_defencoding = 'UTF-8';
4998行的: var $decode_utf8 = false;
  回复  引用    
#4楼 2006-03-09 09:02 | tempsingle [未注册用户]
真正问题所在:

NuSOAP/0.7.2 (1.95) LINE: 5848

[code]
function soap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=true){
parent::nusoap_base();
$this->xml = $xml;
$this->xml_encoding = 'UTF-8'; //$encoding;
$this->method = $method;
$this->decode_utf8 = false; //$decode_utf8;

[/code]

因为NUSOAP本身缺省内码=ISO-8859-1
如果接受到WDSL返回的结果中未显示指定编码状态的结果,譬如:

Response

HTTP/1.1 200 OK
Content-Type: text/xml
Content-Length: 804
Content:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas。。。。。。

注意:
在此处HTTP HEADER 的CONTENT-TYPE未指定字符集
<?XML VERSIOIN=..... ?>中也未指定字符集
就会出现问题。这种情况一般是.NET开发的WSDL服务器端的问题,
未按照标准规定输出必要的东西导致NUSOAP无法正确解码。

这时,你就必须霸王硬上弓了,强行修改里面的PARSE部分的编码指定。

  回复  引用  查看    
#5楼 2006-03-25 09:15 | 自適應軟件......      
暈,你的代碼看起來很亂!
  回复  引用  查看    
#6楼 [楼主]2006-03-25 09:40 | coolstr[占卜師oοΟ]      
哈哈,这个代码不是我写的。是nusoap自带的例子。里面还有很多,你可以自己上去找找的。
  回复  引用    
#7楼 2006-05-26 09:22 | tk [未注册用户]
请问一定要php5才能调用webservice的wsdl文件吗?
  回复  引用  查看    
#8楼 [楼主]2006-05-26 11:33 | coolstr[占卜師oοΟ]      
不是,这个跟PHP的版本没有关系。
文中的例子也是PHP4.x的。
  回复  引用    
#9楼 2006-05-26 16:48 | tk [未注册用户]
谢谢!
  回复  引用    
#10楼 2006-06-20 17:42 | Michelle [未注册用户]
为何我按照你说的修改 报错呢? 我是用 java调用php写的webservcie.我必须 value = binding.searchByKeyword(toISO("安静"));
value = toGBK(value);
经过 两次转码才能得到正确结果。传中文参数时候要。得到结果后还要转
  回复  引用    
#11楼 2006-06-20 17:45 | Michelle [未注册用户]
我现在的这两行是
86行:var $soap_defencoding = 'ISO-8859-1';
4998行: var $decode_utf8 = true;

我该如何修改?
我如果修改为
var $soap_defencoding = 'UTF-8';
var $decode_utf8 = false;
就报错。
  回复  引用    
#12楼 2006-08-17 13:54 | 趸船 [未注册用户]
按照lz的方法改了之后,???是没有了 却出现了一堆这种汉字
Array ( [getCityInfoResult] => 鍩庡競鍦板尯==娌堥槼,鐢佃瘽鍖哄彿==024,閭斂缂栫爜==110000*_*,鍩庡競鍦板尯==杈戒腑,鐢佃瘽鍖哄彿==024,閭斂缂栫爜==110200*_*,鍩庡競鍦板尯==鏂版皯,鐢佃瘽鍖哄彿==024,閭斂缂栫爜==110300 )
怎么办???
  回复  引用    
#13楼 2006-08-24 17:19 | 鹏 [未注册用户]
require_once("encoding/encoding.inc.php");

$CharEncoding=new Encoding();
$CharEncoding->SetGetEncoding("UTF-8")||die("编码名错误");
$CharEncoding->SetToEncoding("GBK")||die("编码名错误");
$CharEncoding->EncodeString($str);
楼上再解次码

encoding/encoding.inc.php下载位置在http://www.phpe.net/class/95.shtml
  回复  引用  查看    
#14楼 2006-09-15 09:00 | 占卜师oοΟ      
@Michelle
@趸船

两位不好意思,我并没有拿这个来做过服务器端。
  回复  引用    
#15楼 2006-10-06 14:45 | DNSing [未注册用户]
呵呵...今天无意中因为PHP Nusoap的编码问题在网上搜了一下,突然搜到这里来了,看到同行们都这么涌跃的讨论.看完占卜师的这篇文章之后就突然有了灵感,因为他只做过客户端.我现在的情况是刚好反过来,我是只服务器端给.net环境下调用.问题也是中文返回乱码,英文则没问题...我也想过了很多方法,但最后只是指定了编码就OK了...就下面这句

$soap->soap_defencoding = 'UTF-8';
$soap->decode_utf8 = false;

在服务器端创建时加上以下两行代码就迎刃而解了,呵呵...

我也写了一篇关于Nusoap与C#之间调用的问题的文章.有空可以多多交流...
my website:http://www.dnsing.com
  回复  引用    
#16楼 2006-11-01 14:41 | Joseph[匿名] [未注册用户]
非常好用,感谢!
  回复  引用    
#17楼 2007-10-24 16:40 | ffff [未注册用户]
為什麼我改了還是不行呢




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-03-28 08:32 编辑过
Google站内搜索
找找看

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: