亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【thrift】vc中使用thrift中文字符串亂碼問(wèn)題解

系統(tǒng) 3098 0

問(wèn)題描述:

VC中使用Apache thrift時(shí),如果字符串中包含中文,會(huì)出現(xiàn)亂碼問(wèn)題,這個(gè)問(wèn)題的原因是由于thrift為了達(dá)到跨語(yǔ)言交互而使用了UTF-8格式發(fā)送字符串,這點(diǎn)對(duì)java或者C#不會(huì)造成影響,但是在VC中UTF-8卻很成問(wèn)題。VC中的string編碼隨項(xiàng)目編碼一般是multibytes或者unicode,雖然倡導(dǎo)使用unicode,但實(shí)際上使用multibytes多字節(jié)開(kāi)發(fā)仍然廣泛存在,下面的解決方案主要解決的是多字節(jié)下的亂碼問(wèn)題。

解決方案

1、手動(dòng)轉(zhuǎn)換

第一種解決方案就是在使用的時(shí)候,自己手動(dòng)轉(zhuǎn)換,讀取時(shí)從utf-8轉(zhuǎn)為multibytes,寫(xiě)入時(shí)從multibytes轉(zhuǎn)為utf-8。顯然這樣費(fèi)時(shí)費(fèi)力,只適用于中文字符存在較少的場(chǎng)景。

2、修改thrift lib庫(kù)

為了達(dá)到一勞永逸的目的,可以修改thrift c++ lib庫(kù)來(lái)完成轉(zhuǎn)換,這里只分析使用TBinaryProtocol的場(chǎng)景,其他Protocol如果出現(xiàn)相同情況請(qǐng)參照。

打開(kāi)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

    
      
      
        //
      
      
        添加多字節(jié)到UTF-8轉(zhuǎn)換
      
      
            

#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 > 
      
        0
      
      
        ) {

    
      
      
        this
      
      ->trans_->write((uint8_t*
      
        )theStr.data(), size);

  }

  
      
      
        return
      
       result +
      
         size;

}
      
    

?重新編譯lib庫(kù),測(cè)試OK。

這樣會(huì)存在一定的效率損失(讀取寫(xiě)入都會(huì)復(fù)制一遍),但是相對(duì)于手動(dòng)轉(zhuǎn)換卻能大大節(jié)省工作量。

其中的轉(zhuǎn)換函數(shù)mb_to_utf8和utf8_to_mb可以在網(wǎng)上找到大量源碼。

【thrift】vc中使用thrift中文字符串亂碼問(wèn)題解決


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产精品1 | 国产不卡在线观看视频 | 亚洲欧美不卡中文字幕 | 亚洲高清色 | 午夜视频国产 | 亚洲国产日韩a在线亚洲 | 91精品啪国产在线观看免费牛牛 | 精品亚洲欧美中文字幕在线看 | 美国黑人特大一级毛片 | 日本中文字幕在线视频 | 久久99精品国产自在现线小黄鸭 | 国产a免费| 麻豆精品视频 在线视频 | 成人国产一区 | 在线一区国产 | 老妇激情毛片免费中国 | h视频在线观看网站 | 久久久久国产精品免费网站 | 国产欧美视频一区二区三区 | 久热精品在线 | 久久亚洲国产成人精品性色 | 成人在线亚洲 | 国产精品大全国产精品 | 亚洲一级成人 | 欧美日韩亚洲区久久综合 | 成人动漫影院 | 九九99线视频在线观看 | 免费看国产精品久久久久 | 日韩成人精品 | 四虎国产一区 | 久久夜色精品国产噜噜小说 | 美女视频免费在线观看 | 看免费5xxaaa毛片30厘米 | 亚洲综合无码一区二区 | 丝袜亚洲精品中文字幕一区 | 久久久视 | 亚洲精品午夜级久久久久 | 在线不卡福利 | 91青娱乐在线 | 奇米影视4444| 亚洲天堂一区二区三区 |