zoukankan      html  css  js  c++  java
  • linux下UTF8和GB2312之间转换

    最近在做中文的处理,需要在UTF8和GB2312之间进行转换,就简单封装了一下。

    记下来,备忘!

    注:需要头文件 iconv.h 和 errno.h

    /**
     * @name 字符编码枚举
     * 可以在这里增加更多的编码支持,具体可以man iconv看下
     */
    typedef enum 
    {
        CP_UTF8 = 0,                    /// UTF-8 编码
        CP_GB2312                       /// GB2312 编码
    } CP; 
    
    
    int convertCP(const char* pszSrc, size_t nSrcLen, 
                char* pszDst, size_t& nDstLen, CP from, CP to) 
    {
        if (NULL == pszSrc || NULL == pszDst || 0 == nSrcLen || 0 == nDstLen)
        {   
            return -3; 
        }   
    
        if (from == to) 
        {   
            if (nDstLen < nSrcLen)
                return -2; 
            else 
                strncpy(pszDst, pszSrc, nSrcLen);
            return 0;
        }   
    
        // 进行转码
        iconv_t cd = iconv_open(get_CP_str(to), get_CP_str(from));
    
        if (0 == cd) 
        {   
            return -1; 
        }   
    
        memset(pszDst, 0, nDstLen);
        
      size_t nOldLen = nSrcLen; if (static_cast<size_t>(-1) == iconv(cd, const_cast<char**>(&pszSrc), &nSrcLen, &pszDst, &nDstLen)) { iconv_close(cd); if (E2BIG == errno) return -2; return -3; }   nDstLen = nOldLen - nDstLen; // 转换的字节数 iconv_close(cd); return 0; } const char* get_CP_str(CP code) { // IGNORE 可以使得 iconv 函数忽略非法字符 switch (code) { case CP_GB2312: return "gb2312//IGNORE"; case CP_UTF8: default: return "utf-8//IGNORE"; } }

      

  • 相关阅读:
    实验四
    实验三
    实验二
    实验一
    6
    5
    4
    3
    shiyan2
    实验1
  • 原文地址:https://www.cnblogs.com/watermoon/p/2780253.html
Copyright © 2011-2022 走看看