linux下UTF-8和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";
    }
}
 
                    
                     
                    
                 
                    
                 
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号