字符串转码

来源:互联网 发布:高德导航 gps端口 编辑:程序博客网 时间:2024/05/16 07:00

转码:utf-8和gbk


问题描述:字符串编码的互转

main.c

#include<stdio.h>#include<locale.h>#include<stdlib.h>#include<string.h>/** @brief 转码:utf-8到gbk* @param gbkStr         转码结果存放地址* @param srcUtf8Str     源字符串* @param maxGbkStrlen   gbkStr最大长度* @return 返回结果字符串长度。    -1, fail; >0, success*/int utf82Gbk(char* gbkStr, const char* srcUtf8Str, int maxGbkStrLen){//思路:utf8 -> unicode -> gbk    if(NULL == srcUtf8Str)    {        printf("Bad parameter !\n");        return -1;    }    if(NULL == setlocale(LC_ALL, "zh_CN.utf8")) //设置转换为unicode前的码,当前为utf8编码    {        printf("Bad parameter !\n");        return -1;    }    int unicodeLen = mbstowcs(NULL, srcUtf8Str, 0);//计算转换后的长度    if(unicodeLen <= 0)    {        printf("Can not transfer ! !\n");        return -1;    }    wchar_t* unicodeStr = (wchar_t*)calloc(sizeof(wchar_t), unicodeLen + 1);    mbstowcs(unicodeStr, srcUtf8Str, strlen(srcUtf8Str));//将utf8转换为unicode    if(NULL == setlocale(LC_ALL, "zh_CN.gbk"))//设置unicode转换后的码,当前为gbk    {        printf("Bad parameter !\n");        return -1;    }    int gbkLen = wcstombs(NULL, unicodeStr, 0);//计算转换后的长度    if(gbkLen <= 0)    {        printf("Bad parameter !\n");        return -1;    }else if(gbkLen >= maxGbkStrLen)//判断空间是否足够    {        printf("gbkStr memory not enough !\n");        return -1;    }    wcstombs(gbkStr, unicodeStr, gbkLen);    gbkStr[gbkLen] = 0;    free(unicodeStr);    return gbkLen;}/** @brief 转码:gbk到utf-8* @param utf8Str        转码结果存放地址* @param srcGbkStr      源字符串* @param maxUtf8Strlen  gbkStr最大长度* @return 返回结果字符串长度。    -1, fail; >0, success*/int gbk2Utf8(char* utf8Str, const char* srcGbkStr, int maxUtf8StrLen){//思路:gbk -> unicode -> utf-8    if(NULL == srcGbkStr)    {        printf("Bad parameter !\n");        return -1;    }    if(NULL == setlocale(LC_ALL, "zh_CN.gbk"))    {        printf("Bad parameter !\n");        return -1;    }    int unicodeLen = mbstowcs(NULL, srcGbkStr, 0);    if(unicodeLen <= 0)    {        printf("Can not transfer !!\n");        return -1;    }    wchar_t* unicodeStr = (wchar_t*)calloc(sizeof(wchar_t), unicodeLen + 1);    mbstowcs(unicodeStr, srcGbkStr, strlen(srcGbkStr));    if(NULL == setlocale(LC_ALL, "zh_CN.utf8"))    {        printf("Bad parameter !\n");        return -1;    }    int utf8Len = wcstombs(NULL, unicodeStr, 0);    if(utf8Len <= 0)    {        printf("Can not transfer !!\n");        return -1;    }else if(utf8Len >= maxUtf8StrLen){        printf("utf8Str memory not enough !\n");        return -1;    }    wcstombs(utf8Str, unicodeStr, utf8Len);    utf8Str[utf8Len] = 0;    free(unicodeStr);    return utf8Len;}int main(void){    char str[] = "星期一\n";    puts(str);    char gbkStr[32];    utf82Gbk(gbkStr, str, 32);    puts(gbkStr);    char utf8Str[32];    gbk2Utf8(utf8Str, gbkStr, 32);    puts(utf8Str);    return 0;}
0 0
原创粉丝点击