Chinaunix

标题: linux unicode utf8 gbk windows 乱码 [打印本页]

作者: tur0000    时间: 2014-08-12 17:33
标题: linux unicode utf8 gbk windows 乱码

情况是这样的
linux跑着后台程序
windows客户端执行某一个操作,服务端会返回一个值。
有个地方 can not transfer   

注意看下面字段的   两段 ###### 之间的   

我想知道 这是程序问题 还是linux系统某方面的问题,  报错提示为获取到计算转换长度。
程序转码字段:
int CGlobalSetting::gbk2utf8(char *utfStr, char *srcStr,int maxUtfStrlen)
{
        printf("CGlobalSetting::gbk2utf8(char *utfStr, char *srcStr,int maxUtfStrlen)\n");

        if(NULL==srcStr)  
        {  
                printf("Bad Parameter\n");  
                return -1;  
        }  

        //首先先将gbk编码转换为unicode编码  
        if(NULL==setlocale(LC_ALL,"zh_CN.gbk"))//设置转换为unicode前的码,当前为gbk编码  
        {  
                printf("Bad Parameter\n");  
                return -1;  
        }  

        int unicodeLen=mbstowcs(NULL,srcStr,0);//计算转换后的长度  
        if(unicodeLen<=0)  
        {  
                printf("Can not Transfer 1:%d!!!\n", unicodeLen);  
                return -1;  
        }  
        wchar_t *unicodeStr=(wchar_t *)calloc(sizeof(wchar_t),unicodeLen+1);  
        int nRet = mbstowcs(unicodeStr,srcStr,strlen(srcStr));//将gbk转换为unicode  
        if (nRet == -1)
        {
                printf(" mbstowcs(unicodeStr,srcStr,strlen(srcStr));//将gbk转换为unicode   fail\n");  
        }

        //将unicode编码转换为utf8编码  
        if(NULL==setlocale(LC_ALL,"zh_CN.utf8"))//设置unicode转换后的码,当前为utf8  
        {  
                printf("Bad Parameter\n");  
                return -1;  
        }  
        int utfLen=wcstombs(NULL,unicodeStr,0);//计算转换后的长度  
        if(utfLen<=0)  
        {  
                printf("Can not Transfer 2:%d!!!\n", utfLen);  
                return -1;  
        }  
        else if(utfLen>=maxUtfStrlen)//判断空间是否足够  
        {  
                printf("Dst Str memory not enough\n");  
                return -1;  
        }  
        nRet = wcstombs(utfStr,unicodeStr,utfLen);  
        utfStr[utfLen]=0;//添加结束符  
        free(unicodeStr);  

        if (nRet == -1)
        {
                printf(" wcstombs(utfStr,unicodeStr,utfLen);  \n");  
        }

        return utfLen;  
}

int CGlobalSetting::utf82gbk(char *utfStr, char *srcStr,int maxUtfStrlen)
{
        printf("int CGlobalSetting::utf82gbk(char *utfStr, char *srcStr,int maxUtfStrlen)\n");

        if(NULL==srcStr)  
        {  
                printf("Bad Parameter\n");  
                return -1;  
        }  

        //首先先将gbk编码转换为unicode编码  
        if(NULL==setlocale(LC_ALL,"zh_CN.utf8"))//设置转换为unicode前的码,当前为gbk编码  
        {  
                printf("Bad Parameter\n");  
                return -1;  
        }  

###################################################################################

        int unicodeLen=mbstowcs(NULL,srcStr,0);//计算转换后的长度  
        if(unicodeLen<=0)  
        {  
                printf("Can not Transfer 1:%d!!!\n", unicodeLen);  
                return -1;  
        }  

[fly]无法获取计算转换后的长度 上面图片的报错[/fly]                这个地方我特地用####加重 方便观看。
##########################################################################################
        wchar_t *unicodeStr=(wchar_t *)calloc(sizeof(wchar_t),unicodeLen+1);  
        int nRet = mbstowcs(unicodeStr,srcStr,strlen(srcStr));//将gbk转换为unicode  
        if (nRet == -1)
        {
                printf(" int nRet = mbstowcs(unicodeStr,srcStr,strlen(srcStr));//将gbk转换为unicode  \n");  
        }

        //将unicode编码转换为utf8编码  
        if(NULL==setlocale(LC_ALL,"zh_CN.gbk"))//设置unicode转换后的码,当前为utf8  
        {  
                printf("Bad Parameter\n");  
                return -1;  
        }  
        int utfLen=wcstombs(NULL,unicodeStr,0);//计算转换后的长度  
        if(utfLen<=0)  
        {  
                printf("Can not Transfer 2:%d!!!\n", utfLen);  
                return -1;  
        }  
        else if(utfLen>=maxUtfStrlen)//判断空间是否足够  
        {  
                printf("Dst Str memory not enough\n");  
                return -1;  
        }  
        nRet = wcstombs(utfStr,unicodeStr,utfLen);  
        utfStr[utfLen]=0;//添加结束符  
        free(unicodeStr);  

        if (nRet == -1)
        {
                printf("wcstombs(utfStr,unicodeStr,utfLen);  \n");  
        }

        return utfLen;  
}









欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2