字符串轉碼

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