【thrift】vc中使用thrift中文字符串乱码问题解决
问题描述:
VC中使用Apache thrift时,如果字符串中包含中文,会出现乱码问题,这个问题的原因是由于thrift为了达到跨语言交互而使用了UTF-8格式发送字符串,这点对java或者C#不会造成影响,但是在VC中UTF-8却很成问题。VC中的string编码随项目编码一般是multibytes或者unicode,虽然倡导使用unicode,但实际上使用multibytes多字节开发仍然广泛存在,下面的解决方案主要解决的是多字节下的乱码问题。
解决方案
1、手动转换
第一种解决方案就是在使用的时候,自己手动转换,读取时从utf-8转为multibytes,写入时从multibytes转为utf-8。显然这样费时费力,只适用于中文字符存在较少的场景。
2、修改thrift lib库
为了达到一劳永逸的目的,可以修改thrift c++ lib库来完成转换,这里只分析使用TBinaryProtocol的场景,其他Protocol如果出现相同情况请参照。
打开TBinaryProtocol.h和TBinaryProtocol.tcc,修改其readString和writeString方法
template <class Transport_>
template<typename StrType>
uint32_t TBinaryProtocolT<Transport_>::readString(StrType& str) {
uint32_t result;
int32_t size;
result = readI32(size);
result += readStringBody(str, size);
//modified by xiaosuiba
//convert utf-8 to multibytes
#ifdef _WIN32
str = utf8_to_mb(str);
#endif
return result;
}
template <class Transport_>
template<typename StrType>
uint32_t TBinaryProtocolT<Transport_>::writeString(const StrType& str) {
//modified by xiaosuiba
//添加多字节到UTF-8转换 #ifdef _WIN32
StrType theStr = mb_to_utf8(str);
#else
const StrType &theStr = str;
#endif if(theStr.size() > static_cast<size_t>((std::numeric_limits<int32_t>::max)()))
throw TProtocolException(TProtocolException::SIZE_LIMIT);
uint32_t size = static_cast<uint32_t>(theStr.size());
uint32_t result = writeI32((int32_t)size);
if (size > ) {
this->trans_->write((uint8_t*)theStr.data(), size);
}
return result + size;
}
重新编译lib库,测试OK。
这样会存在一定的效率损失(读取写入都会复制一遍),但是相对于手动转换却能大大节省工作量。
其中的转换函数mb_to_utf8和utf8_to_mb可以在网上找到大量源码。
【thrift】vc中使用thrift中文字符串乱码问题解决的更多相关文章
- Java中FTPClient上传中文目录、中文文件名乱码问题解决方法【好用】
转: Java中FTPClient上传中文目录.中文文件名乱码问题解决方法 问题描述: 使用org.apache.commons.net.ftp.FTPClient创建中文目录.上传中文文件名时,目录 ...
- C#中StreamReader读取中文出现乱码
转自yhrun原文C#中StreamReader读取中文出现乱码 原因是自Windows 2000之后的操作系统在文件处理时默认编码采用Unicode 所以.NET文件的默认编码也是Unicode.除 ...
- [转]C#中StreamReader读取中文出现乱码
摘自:C#中StreamReader读取中文出现乱码 原因是自Windows 2000之后的操作系统在文件处理时默认编码采用Unicode所以.NET文件的默认编码也是Unicode.除非另外指定,S ...
- PHP substr() 函数截取中文字符串乱码
用PHP substr() 函数截取中文字符串乱码,换PHPmb_substr() 函数即可
- openerp 7.0邮件接收中文附件乱码问题解决办法
openerp 7.0邮件接收中文附件乱码问题解决办法: 修改文件\addons\mail\mail_thread.py #1064 line插入代码: h=email.Header.Header(n ...
- SpringMVC使用@ResponseBody注解返回中文字符串乱码的问题
先说一下我的经历,以及解决问题的而过程. 在使用SpringMVC的时候,最开始的时候在配置文件中使用<mvc:annotation-driven />去自动注册DefaultAnnota ...
- spring mvc 返回乱码SpringMVC使用@ResponseBody注解返回中文字符串乱码的问题
原文地址:https://www.cnblogs.com/fzj16888/p/5923232.html 先说一下我的经历,以及解决问题的而过程. 在使用SpringMVC的时候,最开始的时候在配置文 ...
- 字符编码之间的转换 utf-8 , gbk等,(解决中文字符串乱码)
目录 1.背景. 2.编码的理解 3.编码之间的相互转化 4. str类型说明 5. 可以使用的编码类型 6.参考文章 1.背景 Python中与其他程序进行交互时,如果存在字符串交互,特别是字符串中 ...
- Ajax回调函数返回的中文字符串乱码问题
通过ajax提交请求,返回的response所带的中文字符串一直显示为乱码,写了如下代码也无效: response.setCharacterEncoding("UTF-8"); r ...
随机推荐
- tf树
tf变换(1) TF库的目的是实现系统中任一个点在所有坐标系之间的坐标变换,也就是说,只要给定一个坐标系下的一个点的坐标,就能获得这个点在其他坐标系的坐标. 使用tf功能包,a. 监听tf变换: ...
- 常用global.css
html, body, ul, li, ol, dl, dd, dt, p, h1, h2, h3, h4, h5, h6, form, fieldset, legend, img { margin: ...
- 分布式服务框架 Zookeeper(一)介绍
一.概述 ZooKeeper(动物园管理员),顾名思义,是用来管理Hadoop(大象).Hive(蜜蜂).Pig(小猪)的管理员,同时Apache Hbase.Apache Solr.LinkedIn ...
- 安装Redis图形监控工具---RedisLive
RedisLive简介 RedisLive是一款用Python编写基于WEB的Redis图形监控工具,也是一款实时监控Redis数据的开源软件,以WEB的形式展现出redis中的key的情况,实例数据 ...
- Notepad++集成Subversion SVN插件
点击Plugin –> Plugin Manager –> Show Plugin Manager 打开后,在“Available”页找到“Subversion”,然后点击“Install ...
- 多媒体开发之rtp打包---打包中的FU-A分包方式说明
继上篇rtp中的时间戳和负载类型之后,升入到了nalu的分片打包问题,这里做下笔记 (1)fu-a的打包格式 1.基于RTP协议的打包及解包 (1)单个NAL打包 H.264NALU单元常由[star ...
- 查询SQL2008字段和注释
SELECT 表名 then d.name else '' end, 表说明 then isnull(f.value,'') else '' end, 字段序号 = a.colorder, 字段名 = ...
- 矩阵十题【六】 poj3070 Fibonacci
题目链接:http://poj.org/problem? id=3070 题目大意:给定n和10000,求第n个Fibonacci数mod 10000 的值,n不超过2^31. 结果保留四位数字. 非 ...
- mongodb 配置单实例与双实例
环境: centos6.5 192.168.16.70 配置单实例mongodb:[root@www soft]# tar xf mongodb-linux-x86_64-rhel62-3.2.7.t ...
- EasyPlayer_Android RTSP安卓播放器直播画面卡在第一帧问题修复
最近发现某些Android安卓手机在运行EasyPlayer播放视频时,会停留在第一帧画面,虽然有码率预示着接收端没有问题,但是画面却卡着不动. 一般来讲,这个现象有三种原因导致: 没有接收到视频帧; ...