轉碼: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;
}