查表法utf8转gbk
- 前言
- 制作bin文件
- 添加代码
前言
由于要使用esp32获取天气信息,从服务器返回的json文件编码格式为utf8格式,而我制作的字库为gb2312字库,中文会出现乱码。在网上找了很久,最简单的方法是查表法,由于utf8和gbk编码无法直接转换,使用表进行查找,此方法需要单片机有足够的存储空间,代码参考链接: link.
制作bin文件
使用正点原子的c2b转换工具,将表转换为bin文件, 表格代码在前言的链接代码中。
添加代码
int SwitchToGbk(const unsigned char* pszBufIn, int nBufInLen, unsigned char* pszBufOut, int* pnBufOutLen)
{int i = 0;int j = 0;unsigned short unicode;char gbk[50];char file[30];strcpy(file, "/spiffs/c2b.bin");FILE* fp = fopen(file, "rb");if (fp == NULL) {ESP_LOGW(__FUNCTION__, "File not found [%s]", file);return -1;}for(; i < nBufInLen; i++, j++){if((pszBufIn[i] & 0x80) == 0x00) // 1?{pszBufOut[j]= pszBufIn[i];}else if ((pszBufIn[i] & 0xF0) == 0xE0) // 3? {if (i+ 2 >= nBufInLen) return -1; unicode = (((int)(pszBufIn[i] & 0x0F)) << 12) | (((int)(pszBufIn[i+1] & 0x3F)) << 6) | (pszBufIn[i+2] & 0x3F); fseek(fp, 2*(unicode-0x4e00), SEEK_SET );fread(gbk, 1,2, fp); //这里是打开表文件寻找相应位置 // SPI_Flash_Read(gbk,utf8_info.utf8togbkddr+(2*(unicode-0x4e00)),2);pszBufOut[j]= gbk[1];//gbk%256;pszBufOut[j+1] = gbk[0];//gbk/256;.j++;i+=2;}else{ESP_LOGI("U2C", "不知原因");return -1;}}*pnBufOutLen = j;fclose(fp);return 0;
}