转码: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;
}