C++多国语言字符处理

 详细请参考:http://www.cppblog.com/lf426/

 

 //第一种方案:利用C运行时库函数转换

const std::wstring s2ws(const std::string& s)
{
      std::locale old_loc = std::locale::global(std::locale(""));

      const char* src_str = s.c_str();
      const size_t buffer_size = s.size() + 1;
      wchar_t* dst_wstr = new wchar_t[buffer_size];
      wmemset(dst_wstr, 0, buffer_size);
      mbstowcs(dst_wstr, src_str, buffer_size);
      std::wstring result = dst_wstr;
      delete []dst_wstr;

      std::locale::global(old_loc);

      return result;
}

 

const std::string ws2s(const std::wstring& ws)
{
      std::locale old_loc = std::locale::global(std::locale(""));

      const wchar_t* src_wstr = ws.c_str();
      size_t buffer_size = ws.size() * sizeof(wchar_t) + 1;
      char* dst_str = new char[buffer_size];
      memset(dst_str, 0, buffer_size);
      wcstombs(dst_str ,src_wstr, buffer_size);
      std::string result = dst_str;
      delete []dst_str;

      std::locale::global(old_loc);

      return result;
}

 

//第二种方案: 利用codecvt和use_facet转换

 

mbstate_t in_cvt_state;
mbstate_t out_cvt_state;

const std::wstring s2ws(const std::string& s)
{
      std::locale sys_loc("");

      const char* src_str = s.c_str();
      const size_t BUFFER_SIZE = s.size() + 1;

      wchar_t* intern_buffer = new wchar_t[BUFFER_SIZE];
      wmemset(intern_buffer, 0, BUFFER_SIZE);

      const char* extern_from = src_str;
      const char* extern_from_end = extern_from + s.size();
      const char* extern_from_next = 0;
      wchar_t* intern_to = intern_buffer;
      wchar_t* intern_to_end = intern_to + BUFFER_SIZE;
      wchar_t* intern_to_next = 0;

      typedef std::codecvt<wchar_t, char, mbstate_t> CodecvtFacet;

      CodecvtFacet::result cvt_rst =  std::use_facet<CodecvtFacet>(sys_loc).in(
             in_cvt_state,
              extern_from, extern_from_end, extern_from_next,
              intern_to, intern_to_end, intern_to_next);


        if (cvt_rst != CodecvtFacet::ok) {
         switch(cvt_rst) {
           case CodecvtFacet::partial:
                 std::cerr << "partial";
                 break;
           case CodecvtFacet::error:
                 std::cerr << "error";
                 break;
           case CodecvtFacet::noconv:
                 std::cerr << "noconv";
                 break;
           default:
                 std::cerr << "unknown";
           }
          std::cerr    << ", please check in_cvt_state."  << std::endl;
       }
      std::wstring result = intern_buffer;      

      delete []intern_buffer;

      return result;
}

 

const std::string ws2s(const std::wstring& ws)
{
      std::locale sys_loc("");

      const wchar_t* src_wstr = ws.c_str();
      const size_t MAX_UNICODE_BYTES = 4;
      const size_t BUFFER_SIZE =
      ws.size() * MAX_UNICODE_BYTES + 1;

      char* extern_buffer = new char[BUFFER_SIZE];
      memset(extern_buffer, 0, BUFFER_SIZE);

      const wchar_t* intern_from = src_wstr;
      const wchar_t* intern_from_end = intern_from + ws.size();
      const wchar_t* intern_from_next = 0;
      char* extern_to = extern_buffer;
      char* extern_to_end = extern_to + BUFFER_SIZE;
      char* extern_to_next = 0;

 

      typedef std::codecvt<wchar_t, char, mbstate_t> CodecvtFacet;

      CodecvtFacet::result cvt_rst =   std::use_facet<CodecvtFacet>(sys_loc).out(
             out_cvt_state,
              intern_from, intern_from_end, intern_from_next,
              extern_to, extern_to_end, extern_to_next);


      if (cvt_rst != CodecvtFacet::ok) {
           switch(cvt_rst) {
                case CodecvtFacet::partial:
                      std::cerr << "partial";
                      break;
                case CodecvtFacet::error:
                      std::cerr << "error";
                      break;
                case CodecvtFacet::noconv:
                      std::cerr << "noconv";
                      break;
                  default:
                      std::cerr << "unknown";
          }
           std::cerr    << ", please check out_cvt_state."   << std::endl;
      }
      std::string result = extern_buffer;

      delete []extern_buffer;

      return result;
}

//第三种方案: 利用fstream转换
const std::wstring s2ws(const std::string& s)
{
      std::locale sys_loc("");

     std::ofstream ofs("cvt_buf");
      ofs << s;
      ofs.close();

     std::wifstream wifs("cvt_buf");
      wifs.imbue(sys_loc);
      std::wstring wstr;
      wifs >> wstr;
      wifs.close();

     return wstr;
}


const std::string ws2s(const std::wstring& s)
{
      std::locale sys_loc("");

     std::wofstream wofs("a");
      wofs.imbue(sys_loc);
      wofs << s;
      wofs.close();

     std::ifstream ifs("a");
      std::string str;
      ifs >> str;
      ifs.close();

     return str;
}

// 第四种方案: 利用gettext

 

//第五种方案:利用 boost新版本中的locale

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值