免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2063 | 回复: 0
打印 上一主题 下一主题

[函数] linux unicode utf8 gbk windows 乱码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-12 17:33 |只看该作者 |倒序浏览

情况是这样的
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;  
        }  

无法获取计算转换后的长度 上面图片的报错                这个地方我特地用####加重 方便观看。
##########################################################################################
        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;  
}




您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP