解决Ruby调用带中文参数的WebService的问题。

虽然说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#来编写:

[WebMethod]
    
public   string  HelloWorld1( string  aa)
    
{
        
return "Hello Worl "+aa;
    }


客户端的代码如下:

require   ' soap/wsdlDriver '
require   ' soap/rpc/driver '
require   ' iconv '   # 要处理中文转换

wsdl 
=   ' http://localhost/CSMIS/WebService/FileTransferService.asmx?wsdl '
driver 
=  SOAP :: WSDLDriverFactory . new(wsdl) . create_rpc_driver
driver
. wiredump_file_base  =   " c:/ws.log "   # 加上这句的话,可以把调用WS的请求保存到这个文件
XSD :: Charset . encoding  =   " UTF8 "
# 调用WS时,一定要传入一个HashTable,它的Key与WS的参数名对应。
#result = driver.helloWorld1(:aa=> "中国人") #这里如果是直接调用会出错。要用下面这行代码转换

result  =  driver . helloWorld1( : aa => Iconv . conv( ' utf-8 ' ,   ' gbk ' ,   " 中国人 " ))
# putsresult.helloWorld1Result #直接显示结果会出现乱码现象,也要转换。
puts Iconv . conv( ' gbk ' , ' utf-8 ' , result . helloWorld1Result)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值