cgi 中字符集转换

由于工作需要字符集的转换,所以记录下来以便查看.

 

int  Gb2312ToUtf8( char   * sOut,  int  iMaxOutLen,  const   char   * sIn,  int  iInLen)
{
    
char *pIn = (char *)sIn;
    
char *pOut = sOut;
    size_t ret;
    
int iLeftLen;
    iconv_t cd;
    
    cd 
= iconv_open("utf-8""gb2312");
    
if (cd == (iconv_t) - 1)
    
{
        
return -1;
    }

    
    iLeftLen 
= iMaxOutLen;
    
    ret 
= iconv(cd, &pIn, (size_t *& iInLen, &pOut, (size_t *)&iLeftLen);
    
if (ret == (size_t) - 1)
    
{
        iconv_close(cd);
        
return -1;
    }

    
    iconv_close(cd);
    
    
return (iMaxOutLen - iLeftLen);
}


int  Utf8ToGb2312( char   * sOut,  int  iMaxOutLen,  const   char   * sIn,  int  iInLen)
{
    
char *pIn = (char *)sIn;
    
char *pOut = sOut;
    size_t ret;
    
int iLeftLen;
    iconv_t cd;
    
    cd 
= iconv_open("gb2312""utf-8");
    
if (cd == (iconv_t) - 1)
    
{
        
return -1;
    }

    
    iLeftLen 
= iMaxOutLen;
    
    ret 
= iconv(cd, &pIn, (size_t *& iInLen, &pOut, (size_t *)&iLeftLen);
    
if (ret == (size_t) - 1)
    
{
        iconv_close(cd);
        
return -1;
    }

    
    iconv_close(cd);
    
    
return (iMaxOutLen - iLeftLen);
}




int  Gbk2Utf8( char   * sOut,  int  iMaxOutLen,  const   char   * sIn,  int  iInLen)
{
    
char * pIn = (char*)sIn;
    
char * pEnd = pIn+iInLen;
    
char * pOut = sOut;
    
int iLeftLen;
    
int iGbkLen;
    
int iRet;
    iconv_t cd;
    
    cd 
= iconv_open("UTF-8","GBK");
    
if (cd == (iconv_t)-1
    
{
        
return -1;
    }

    
    iLeftLen 
= iMaxOutLen;
    
while(pIn<pEnd) 
    
{
        
if((unsigned char)(*pIn)==0x80
        

            
//注意GBK的0x80转换为UTF-8时为E2 82 AC
            *pOut = 0xe2; pOut++; iLeftLen--;
            
*pOut = 0x82; pOut++; iLeftLen--;
            
*pOut = 0xac; pOut++; iLeftLen--;
            pIn
++;
        }

        
else if((unsigned char)(*pIn)<0x80
        

            
//单字节(GBK: 0x00-0x7F)
            *pOut = *pIn;
            pIn
++;pOut++;iLeftLen--;
        }

        
else 
        

            
//双字节
            iGbkLen=2;
            iRet
=iconv(cd, (char **)&pIn, (size_t *)&iGbkLen, (char **)&pOut, (size_t *)&iLeftLen);
            
if(iRet<0)
            
{
                
*pOut = ' '//暂时替换为空格
                pIn+=2; pOut++; iLeftLen--;
            }
 
        }

    }

    
    iconv_close(cd);
    sOut[iMaxOutLen 
- iLeftLen]='

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值