zoukankan      html  css  js  c++  java
  • 字符串编码之间的转换(GB2312<->UTF8<->Unicode)及URLEncoding

    LPWSTR GB2312ToUnicode(LPCSTR lpszInBuf)
    {
    if(NULL == lpszInBuf)
    {
    return NULL;
    }
    WCHAR* pBuf = NULL;
    int nLen = MultiByteToWideChar(CP_ACP, 0, lpszInBuf, -1, pBuf, 0);
    pBuf = new WCHAR[nLen];
    memset(pBuf, 0, sizeof(WCHAR) * nLen);
    MultiByteToWideChar(CP_ACP, 0, lpszInBuf, -1, pBuf, nLen);
    return pBuf;
    }

    LPSTR UnicodeToGB2312(LPCWSTR lpszInBuf)
    {
    if(NULL == lpszInBuf)
    {
    return NULL;
    }
    CHAR* pBuf = NULL;
    int nLen = WideCharToMultiByte(CP_ACP, 0, lpszInBuf, -1, pBuf, 0, NULL, NULL);
    pBuf = new CHAR[nLen];
    memset(pBuf, 0, sizeof(CHAR) * nLen);
    WideCharToMultiByte(CP_ACP, 0, lpszInBuf, -1, pBuf, nLen, NULL, NULL);
    return pBuf;
    }

    LPWSTR UTF8ToUnicode(LPCSTR lpszInBuf)
    {
    if(NULL == lpszInBuf)
    {
    return NULL;
    }
    WCHAR* pBuf = NULL;
    int nLen = MultiByteToWideChar(CP_UTF8, 0, lpszInBuf, -1, pBuf, 0);
    pBuf = new WCHAR[nLen];
    memset(pBuf, 0, sizeof(WCHAR) * nLen);
    MultiByteToWideChar(CP_UTF8, 0, lpszInBuf, -1, pBuf, nLen);
    return pBuf;
    }

    LPSTR UnicodeToUTF8(LPCWSTR lpszInBuf)
    {
    if(NULL == lpszInBuf)
    {
    return NULL;
    }
    CHAR* pBuf =NULL;
    int nLen = WideCharToMultiByte(CP_UTF8, 0, lpszInBuf, -1, pBuf, 0, NULL, NULL);
    pBuf = new CHAR[nLen];
    memset(pBuf, 0, sizeof(CHAR) * nLen);
    WideCharToMultiByte(CP_UTF8, 0, lpszInBuf, -1, pBuf, nLen, NULL, NULL);
    return pBuf;
    }

    LPSTR GB2312ToUTF8(LPCSTR lpszInBuf)
    {
    if(NULL == lpszInBuf)
    {
    return NULL;
    }
    LPWSTR lpszTmp = GB2312ToUnicode(lpszInBuf);
    LPSTR lpszBuf = UnicodeToUTF8(lpszTmp);
    delete[] lpszTmp;
    lpszTmp = NULL;
    return lpszBuf;
    }

    LPSTR UTF8ToGB2312(LPCSTR lpszInBuf)
    {
    if(NULL == lpszInBuf)
    {
    return NULL;
    }
    LPWSTR lpszTmp = UTF8ToUnicode(lpszInBuf);
    LPSTR lpszBuf = UnicodeToGB2312(lpszTmp);
    delete[] lpszTmp;
    lpszTmp = NULL;
    return lpszBuf;
    }

    LPSTR GB2312Encoding(LPCSTR lpszInBuf)
    {
    if(NULL == lpszInBuf)
    {
    return NULL;
    }
    const int nLen = strlen(lpszInBuf) * 3 + 1;
    CHAR* pBuf = new CHAR[nLen];
    memset(pBuf, 0, sizeof(CHAR) * nLen);
    CHAR szTmp[4] = {0};
    for(int i = 0; i != strlen(lpszInBuf); ++i)
    {
    if(IsDBCSLeadByte(lpszInBuf[i]))
    {
    sprintf_s(szTmp, _countof(szTmp), "%%%02X", lpszInBuf[i] & 0xFF);
    }
    else
    {
    sprintf_s(szTmp, _countof(szTmp), "%c", lpszInBuf[i]);
    }
    sprintf_s(pBuf + strlen(pBuf), nLen - strlen(pBuf), "%s", szTmp);
    }
    return pBuf;
    }

    LPSTR UTF8Encoding(LPCSTR lpszInBuf)
    {
    if(NULL == lpszInBuf)
    {
    return NULL;
    }
    const int nLen = strlen(lpszInBuf) * 3 + 1;
    CHAR* pBuf = new CHAR[nLen];
    memset(pBuf, 0, sizeof(CHAR) * nLen);
    CHAR szTmp[4] = {0};
    for(int i = 0; i != strlen(lpszInBuf); ++i)
    {
    if(IsDBCSLeadByte(lpszInBuf[i]))
    {
    sprintf_s(szTmp, _countof(szTmp), "%%%02X", lpszInBuf[i] & 0xFF);
    }
    else
    {
    sprintf_s(szTmp, _countof(szTmp), "%c", lpszInBuf[i]);
    }
    sprintf_s(pBuf + strlen(pBuf), nLen - strlen(pBuf), "%s", szTmp);
    }
    return pBuf;
    }

    // 测试代码
    #include "stdafx.h"
    #include <Windows.h>
    #include <strsafe.h>

    int _tmain(int argc, _TCHAR* argv[])
    {
    CHAR szText[] = "百度Hi";
    CHAR* pBuf = GB2312Encoding(szText);
    MessageBoxA(NULL, pBuf, NULL, 0);
    delete[] pBuf;
    pBuf = NULL;
    return 0;
    }

  • 相关阅读:
    电脑蓝屏的原因及解决方法
    或将引爆第四次工业革命!一张图带你看完人工智能大事件
    sata2.0和sata3.0的区别
    15款顶级的开源人工智能工具推荐
    解读神秘而又强大的百度人工智能计算机
    人工智能让程序员自危:码农大批失业
    电脑开机黑屏只有光标在闪怎么办
    关于XSS漏洞的简介以及分类
    SSD知识
    centos7下安装docker(15.5容器跨主机网络--flanneld)
  • 原文地址:https://www.cnblogs.com/Coterjiesen/p/4901819.html
Copyright © 2011-2022 走看看