寬字節UTF-8、多字節互轉


  在進行Windows編程時,常常遇到不同字符編碼之間的轉換以對應不同的輸出格式,本文介紹寬字節UTF-8編碼格式和多字節之間的項目轉換。分別調用Windows底層函數MultiByteToWideChar和  WideCharToMultiByte實現。

1.UTF-8轉多字節

  

std::string u82mb(const char* cont)
{
    if (NULL == cont)
    {
        return "";
    }

    int num = MultiByteToWideChar(CP_UTF8, NULL, cont, -1, NULL, NULL);
    if (num <= 0)
    {
        return "";
    }
    wchar_t* buffw = new (std::nothrow) wchar_t[num];
    if (NULL == buffw)
    {
        return "";
    }
    MultiByteToWideChar(CP_UTF8, NULL, cont, -1, buffw, num);
    int len = WideCharToMultiByte(CP_ACP, 0, buffw, num - 1, NULL, NULL, NULL, NULL);
    if (len <= 0)
    {
        delete[] buffw;
        return "";
    }
    char* lpsz = new (std::nothrow) char[len + 1]; 
    if (NULL == lpsz)
    {
        delete[] buffw;
        return "";
    }
    WideCharToMultiByte(CP_ACP, 0, buffw, num - 1, lpsz, len, NULL, NULL);
    lpsz[len]='\0';
    delete[] buffw;
    std::string rtn(lpsz);
    delete[] lpsz;
    return rtn;
}

2.多字節轉UTF-8

std::string mb2u8(const char* cont)
{
    if (NULL == cont)
    {
        return "";
    }
    int num = MultiByteToWideChar(CP_ACP, NULL, cont, -1, NULL, NULL);
    if (num <= 0)
    {
        return "";
    }
    wchar_t* buffw = new (std::nothrow) wchar_t[num];
    if (NULL == buffw)
    {
        return "";
    }
    MultiByteToWideChar(CP_ACP, NULL, cont, -1, buffw, num);
    int len = WideCharToMultiByte(CP_UTF8, 0, buffw, num - 1, NULL, NULL, NULL, NULL); 
    if (len <= 0)
    {
        delete[] buffw;
        return "";
    }
    char* lpsz = new (std::nothrow) char[len + 1]; 
    if (NULL == lpsz)
    {
        delete[] buffw;
        return "";
    }
    WideCharToMultiByte(CP_UTF8, 0, buffw, num - 1, lpsz, len, NULL, NULL);
    lpsz[len]='\0';
    delete[] buffw;
    std::string rtn(lpsz);
    delete[] lpsz;
    return rtn ;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM