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

【thrift】vc中使用thrift中文字符串亂碼問題解

系統 2671 0

問題描述:

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

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

  }

  
      
      
        return
      
       result +
      
         size;

}
      
    

?重新編譯lib庫,測試OK。

這樣會存在一定的效率損失(讀取寫入都會復制一遍),但是相對于手動轉換卻能大大節省工作量。

其中的轉換函數mb_to_utf8和utf8_to_mb可以在網上找到大量源碼。

【thrift】vc中使用thrift中文字符串亂碼問題解決


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 午夜免费福利不卡网址92 | 97国产在线视频公开免费 | 欧美日韩色 | 视频二区精品中文字幕 | 日本中文字幕在线精品 | 1000部羞羞禁止免费观看视频 | 婷婷国产天堂久久综合五月 | 欧洲视频一区 | 国产精品国偷自产在线 | 日韩欧美一区二区精品久久 | 亚洲美女在线观看播放 | 国产成人a一在线观看 | 欧美另类jizzhd | 国产精品综合一区二区三区 | 性视频一级 | 99香蕉国产精品偷在线观看 | 日本综合在线观看 | 波多一区 | 中文字幕精品一区 | 久久亚洲精品中文字幕 | 成人在激情在线视频 | 久久精品国产亚洲片 | 成人久久18免费网站 | 华人欧美国产在线精品 | 狠狠干夜夜 | 国产一级淫片a免费播放口欧美 | 奇米777狠狠色噜噜狠狠狠 | 国产欧美综合一区二区 | 青青青国产精品国产精品久久久久 | 国产在视频线精品视频2021 | 久久天堂一区二区三区 | 九天玄帝诀免费完整观看 | 久久久久综合 | 九九影院最新理论片 | 99在线观看视频免费 | 韩国午夜剧场 | 97视频在线观看视频最新 | 五月天婷婷激情视频 | 9299yy看片淫黄大片在线 | 91sao国产在线观看 | 精品精品国产高清a毛片 |