ICE的自动编码转换

来源:互联网 发布:现在开淘宝店卖什么好 编辑:程序博客网 时间:2024/05/19 07:11
Ice是一种面向对象的中间件平台,它适合在异种环境中使用:客户和服务器可以用不同的编程语言编写,可以运行在不同的操作系统和机器架构上,并且可以使用多种网络技术进行通信。无论部署环境如何,这些应用的源码都是可移植的。而且它还是免费的,比较适合于中小型公司,如果是高端需求则可以选择ORACLE公司的Tuxedo。

最近做的项目便使用到了ICE平台,服务端是用C++写(多字节编码),客户端则是android。几天过后服务端终于写完了,于是首先也一样拿C++写了客户端做测试,一切正常。接着开始用JAVA做测试,问题出现了,从JAVA得到结果里的中文全变成了乱码,于是使用new String(strOrgHtml.getBytes("..."), "...")方法进行转码,期间把UTF-8、ISO8859_1、GB2312都换了个便,结果依然是乱码。

立即GOOGLE了许多文章,意思是ICE在传输时使用的是UTF-8编码,但为什么我在JAVA端使用getBytes("UTF-8")后再进行重新编码就是得不到正确结果呢,这个问题百思不得其解,也不想去解了。网上的解决办法是在C++的服务端将所有需要交互的字符串都手动进行UTF-8和GB2312的转换。

我比较喜欢简洁,易维护的代码,所以比较抵制这种手动进行转码方式。想着ICE这么优秀的平台,复杂的工作都完成了,不可能连这个简单的转码没有考虑进去吧,便到官网开始查资料,果不其然,终于查到ICE可以利用邦定转码器来完成所有交互字符串的自动转码。

我的ICE版本为3.3.1,方法是在初始化的时候为InitializationData::stringConverter设定一个转码器,代码如下:

int _tmain(int argc, _TCHAR* argv[])
{
ServerApp app;
Ice::InitializationData initData;
initData.stringConverter = new StringConverterI();// 邦定转码器
initData.properties = Ice::createProperties(initData.stringConverter);
initData.properties->load("config.server");
return app.main(argc, argv, initData);
}


StringConverterI这个就是转码器,实现可以从ICE演示代码“Ice3.3.1\demo\Ice\converter”中获取。(文件为:StringConverterI.h和StringConverterI.cpp)

接着在JAVA端使用下面代码就得到了正确结果。
String strRemark = new String(loginInfo.value.strOrgHtml.getBytes("ISO8859_1"), "GB2312");
原创粉丝点击