字符串转码

转码: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章