背景:
项目需要在mips32架构的freertos系统上将输入的汉字、标点符号、数字、字母等转成机内码输出,第一个想到的办法是移植第三方库进行编码转换,网上搜了一圈libiconv、ICU库都可以实现,但是在我的项目上移植编译各种报错、非常痛苦。遂学习了一番,在计算机C语言编码中,汉字以UTF-8格式存储,想要转成机内码也就是GBK码输出还有一种方法就是对照码表进行转换。
源码
#include <stdio.h>
#include "gbk.h"
void hex_data_to_log_data(unsigned char *src, int len, char *dst)
{
int i = 0;
int index = 0;
char buff[1024] = {0};
for (i = 0; i < len; i++) {
index += sprintf(buff + index, "%02x", src[i]);
index += sprintf(buff + index, " ");
}
if (strlen(buff) > 0) strcpy(dst, buff);
}
int get_gbk_len(char *str) {
char *p = str;
int len = 0;
if (p == NULL) return 0;
while (*p != 0x00) {
len++;
p = p + 1;
}
return len;
}
int main() {
char utf[] = "你好";
char utf_hex[2048] = {0};
char gbk_hex[2048] = {0};
unsigned char gbk[2048] = {0};
strcpy(gbk, u2g(utf));
hex_data_to_log_data((unsigned char *)gbk, get_gbk_len(gbk), gbk_hex);
hex_data_to_log_data((unsigned char *)utf, get_gbk_len(utf), utf_hex);
printf("原文:%s\n", utf);
printf("UTF 编码:%s\n", utf_hex);
printf("GBK 编码:%s\n", gbk_hex);
}
代码解释:
代码非常简单,测试将汉字“你好”转成GBK编码并转成十六进制输出只需要包含一个头文件gbk.h,即可实现UTF-8编码与GBK编码互转。由于gbk.h附带码表整个文件非常大这里仅截图展示,源代码放在下方链接。整个实现.c和.h文件只用到一些C语言标准头文件可跨平台运行。(如果资源暂时未通过审核可评论留言我发给你)
编码转换头文件gbk.h获取
在线编码转换工具网站验证
UTF-8编码
PS:大部分在线汉字转UTF-8其实都是转成unicode编码,这边推荐一个网站
在线汉字转UTF-8
GBK编码