解决Ruby调用带中文参数的WebService的问题。
2007-12-20 12:06
906 查看
虽然说RoR里的很多特性都使开WEB的开发相对简单。但是除了一些框架的问题以外,个人感觉麻烦的一些事情是Ruby对中文的支持还不太好。这两天试着用它来调用一些旧的系统里的WebService,当涉及到中文的参数传输时,就会出错。
以下先说明一下,Ruby中的中文问题:
要转换编码,可以使用以下的方法:
定义一个全局变量:
UTF8_TO_GBK = Iconv.new "gbk", "utf-8"
然后,在需要转换的地方调用以下方法:UTF8_TO_GBK .iconv(str)就可以转换了。
在网上看到一篇关于utf-8与unicode的一些说明,有些帮助,因此转载过来。
utf8和unicode的关系
utf其实是(Unicode Translation Format), 也就是unicode在传输时候的编码, 有utf8和utf16等多种编码, 其实uf8是一个对中文字很不友好的编码, 为什么呢,因为在utf8中, 一个中文是占用3个字节,而一个英文ascii字符却只占用1个字节, 这样一方面使得中文体积膨胀较厉害, 另外一方面也不能简单的通过计算字节数来推算字符数. utf16就比较正常, 每个字符占用两个字节.但是目前utf16已经后面的utf32应用较少, utf8 是比较公认的编码
utf8 还是 gb2312/gbk
我个人选择utf8,因为我觉得gb2312/gbk不是通用编码,如果使用可能还会有其他问题(比如多语言支持)
转换编码
我们需要require 'iconv' 库, 然后执行
Iconv.conv("utf8","GBK","....") #把字符由GBK转换为UTF8
当源字符集中含有非法编码的时候,我们需要告诉iconv忽略, 否则iconv会报错停止
Iconv.conv("utf8//IGNORE","GBK//IGNORE","....")
utf8 的中文操作:
计算字符数:
在默认的ruby环境下面, 需要执行
require 'jcode'
$KCODE='u' # 或者$KCODE='UTF8' 两者是等价的
计算字符数:
使用jsize或者jlength
"你好".size # 6
"你好".jsize # 2
截取字符操作
"你好"[0,1] #乱码
"你好".scan(/./)[0,1].join # "你"
当然还有另外一个办法:
利用utf16编码每个字都是2个字节(头还有两个字节)的特点,我们可以先把字符转换为utf16,然后按照[0,n*2+2]的方法截取前n个字符 (试验成功.求证中)
Iconv.conv("UTF8","UTF16",Iconv.conv("UTF16","UTF8","你好a中b文")[0,8]) #你好a
以一个例子来演示如何传递一个中文参数给WebService:
WebService的服务端我用C#来编写:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
[WebMethod]
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
public string HelloWorld1(string aa)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return "Hello Worl "+aa;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
客户端的代码如下:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
require 'soap/wsdlDriver'
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
require 'soap/rpc/driver'
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
require 'iconv' #要处理中文转换
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
wsdl = 'http://localhost/CSMIS/WebService/FileTransferService.asmx?wsdl'
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
driver = SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
driver.wiredump_file_base = "c:/ws.log" #加上这句的话,可以把调用WS的请求保存到这个文件
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
XSD::Charset.encoding = "UTF8"
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#调用WS时,一定要传入一个HashTable,它的Key与WS的参数名对应。
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#result = driver.helloWorld1(:aa=> "中国人") #这里如果是直接调用会出错。要用下面这行代码转换
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
result = driver.helloWorld1(:aa=>Iconv.conv('utf-8', 'gbk', "中国人"))
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#putsresult.helloWorld1Result #直接显示结果会出现乱码现象,也要转换。
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
puts Iconv.conv('gbk','utf-8',result.helloWorld1Result)
以下先说明一下,Ruby中的中文问题:
要转换编码,可以使用以下的方法:
定义一个全局变量:
UTF8_TO_GBK = Iconv.new "gbk", "utf-8"
然后,在需要转换的地方调用以下方法:UTF8_TO_GBK .iconv(str)就可以转换了。
在网上看到一篇关于utf-8与unicode的一些说明,有些帮助,因此转载过来。
utf8和unicode的关系
utf其实是(Unicode Translation Format), 也就是unicode在传输时候的编码, 有utf8和utf16等多种编码, 其实uf8是一个对中文字很不友好的编码, 为什么呢,因为在utf8中, 一个中文是占用3个字节,而一个英文ascii字符却只占用1个字节, 这样一方面使得中文体积膨胀较厉害, 另外一方面也不能简单的通过计算字节数来推算字符数. utf16就比较正常, 每个字符占用两个字节.但是目前utf16已经后面的utf32应用较少, utf8 是比较公认的编码
utf8 还是 gb2312/gbk
我个人选择utf8,因为我觉得gb2312/gbk不是通用编码,如果使用可能还会有其他问题(比如多语言支持)
转换编码
我们需要require 'iconv' 库, 然后执行
Iconv.conv("utf8","GBK","....") #把字符由GBK转换为UTF8
当源字符集中含有非法编码的时候,我们需要告诉iconv忽略, 否则iconv会报错停止
Iconv.conv("utf8//IGNORE","GBK//IGNORE","....")
utf8 的中文操作:
计算字符数:
在默认的ruby环境下面, 需要执行
require 'jcode'
$KCODE='u' # 或者$KCODE='UTF8' 两者是等价的
计算字符数:
使用jsize或者jlength
"你好".size # 6
"你好".jsize # 2
截取字符操作
"你好"[0,1] #乱码
"你好".scan(/./)[0,1].join # "你"
当然还有另外一个办法:
利用utf16编码每个字都是2个字节(头还有两个字节)的特点,我们可以先把字符转换为utf16,然后按照[0,n*2+2]的方法截取前n个字符 (试验成功.求证中)
Iconv.conv("UTF8","UTF16",Iconv.conv("UTF16","UTF8","你好a中b文")[0,8]) #你好a
以一个例子来演示如何传递一个中文参数给WebService:
WebService的服务端我用C#来编写:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
[WebMethod]
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
public string HelloWorld1(string aa)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return "Hello Worl "+aa;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
客户端的代码如下:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
require 'soap/wsdlDriver'
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
require 'soap/rpc/driver'
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
require 'iconv' #要处理中文转换
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
wsdl = 'http://localhost/CSMIS/WebService/FileTransferService.asmx?wsdl'
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
driver = SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
driver.wiredump_file_base = "c:/ws.log" #加上这句的话,可以把调用WS的请求保存到这个文件
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
XSD::Charset.encoding = "UTF8"
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#调用WS时,一定要传入一个HashTable,它的Key与WS的参数名对应。
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#result = driver.helloWorld1(:aa=> "中国人") #这里如果是直接调用会出错。要用下面这行代码转换
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
result = driver.helloWorld1(:aa=>Iconv.conv('utf-8', 'gbk', "中国人"))
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#putsresult.helloWorld1Result #直接显示结果会出现乱码现象,也要转换。
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
puts Iconv.conv('gbk','utf-8',result.helloWorld1Result)
相关文章推荐
- (转)Delphi 调用C#编写的WebService 参数为Null解决方法 附中文乱码问题
- 通过base64编码解决java的webservice调用中文参数乱码问题
- JSP、AJax中文乱码问题解决,escape(), encodeURI(), encodeURIComponent(),js对参数连续两次调用 encodeURI(String) 方法
- 在Android中调用KSOAP2库访问webservice服务出现的服务端传入参数为null的问题解决
- 解决Java调用php web webService 中文参数乱码
- JSP、AJax中文乱码问题解决,escape(), encodeURI(), encodeURIComponent(),js对参数连续两次调用 encodeURI(String) 方法
- 调用带参数的webservice产生的问题和解决的方法
- 解决KETTLE调用http传输中文参数的问题
- Java调用.Net WebService问题,以及参数为空解决办法
- Xfire调用webservice无法传递参数问题解决
- 解决get方法传递URL参数中文乱码问题
- 解决get方法传递URL参数中文乱码问题
- js、URL传递含有中文参数时的乱码问题解决
- 调用webservice超时问题的解决
- net传递中文参数数据丢失问题解决方案 ,传递中文参数报错
- struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)
- 关于上个Flex-Jsp-DB例子中Flex和Jsp传递中文参数问题的解决方法!(Tomcat服务器)
- 解决get方法传递URL参数中文乱码和解决tomcat下中文乱码问题
- 解决webservice里调用耗时方法出错问题
- 如何解决WebService参数传递中文的问题