zoukankan      html  css  js  c++  java
  • UTF8与std:string互转

      Ajax请求发送的UTF8编码字符串传到后台使用std:string进一步处理,如果包含中文会出现中文乱码的问题:

       

      特找了一下转码的解决方法,直接代码如下:

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    // UTF8转std:string
    // 转换过程:先将utf8转双字节Unicode编码,再通过WideCharToMultiByte将宽字符转换为多字节。
    std::string UTF8_To_string(const std::string& str) 

        
    int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1NULL0); 
        
    wchar_t* pwBuf = new wchar_t[nwLen + 1];    //一定要加1,不然会出现尾巴 
        memset(pwBuf, 0, nwLen * 2 + 2); 
        MultiByteToWideChar(CP_UTF8, 
    0, str.c_str(), str.length(), pwBuf, nwLen); 
        
    int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1NULLNULLNULLNULL); 
        
    char* pBuf = new char[nLen + 1]; 
        memset(pBuf, 
    0, nLen + 1); 
        WideCharToMultiByte(CP_ACP, 
    0, pwBuf, nwLen, pBuf, nLen, NULLNULL);

        std::string strRet = pBuf; 

        
    delete []pBuf; 
        
    delete []pwBuf; 
        pBuf = 
    NULL
        pwBuf = 
    NULL

        
    return strRet; 


    // std:string转UTF8
    std::string string_To_UTF8(const std::string& str) 

        
    int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1NULL0); 
        
    wchar_t* pwBuf = new wchar_t[nwLen + 1];    //一定要加1,不然会出现尾巴 
        ZeroMemory(pwBuf, nwLen * 2 + 2); 
        ::MultiByteToWideChar(CP_ACP, 
    0, str.c_str(), str.length(), pwBuf, nwLen); 
        
    int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1NULLNULLNULLNULL); 
        
    char* pBuf = new char[nLen + 1]; 
        ZeroMemory(pBuf, nLen + 
    1); 
        ::WideCharToMultiByte(CP_UTF8, 
    0, pwBuf, nwLen, pBuf, nLen, NULLNULL); 

        std::string strRet(pBuf); 

        
    delete []pwBuf; 
        
    delete []pBuf; 
        pwBuf = 
    NULL
        pBuf  = 
    NULL

        
    return
     strRet; 

    问题解决bingo!

  • 相关阅读:
    LeetCode(287)Find the Duplicate Number
    LeetCode(290) Word Pattern
    LeetCode(205)Isomorphic Strings
    LeetCode(201) Bitwise AND of Numbers Range
    LeetCode(200) Number of Islands
    LeetCode(220) Contains Duplicate III
    LeetCode(219) Contains Duplicate II
    命令行执行Qt程序
    LeetCode(228) Summary Ranges
    redis 的安装和使用记录
  • 原文地址:https://www.cnblogs.com/MakeView660/p/10185889.html
Copyright © 2011-2022 走看看