小项目使用8266接收WebHook,需要提取消息展示到串口屏
一切顺利,显示数量,图标,时间都很好
到了最后一步显示内容时碰壁了,Arduino发送的是UTF-8编码的
串口屏支持 GB2312 好一些,网上查了一番
有人用 char hello[] ={0xC4,0xE3,0xBA,0xC3}
直接定义编码数组的方式,可以展示一些固定的字符串文本
有人将文件编码从UTF-8
改为ANSI
的
但这两种方法我都没有尝试,我们要展示的内容是接口收到的内容,内容不可控.不能改编码也是因为要从接口获取数据,修改了编码,请求数据又会出现问题
解决办法
最后在Github上,看到了一个别人几年前做的8266气象站:esp8266-weather-station
他的代码中用到了UTF-8
转GB2312
,翻看代码后是网上的另一个思路,查表
PROGMEM unsigned short int code_table[][2] =
{
{
0x4E00, 0xD2BB },
{
0x4E01, 0xB6A1 },
{
0x4E03, 0xC6DF },
{
0x4E07, 0xCDF2 },
{
0x4E08, 0xD5C9 },
{
0x4E09, 0xC8FD },
{
0x4E0A, 0xC9CF },
....
{
0xE813, 0xD7FD },
{
0xE814, 0xD7FE }
};
搭配一个转换函数,将UTF-8
的char
数组转成u16
的数组
void Utf8ToGb2312(const char *utf8, int len, u16 *gbArray)
{
int k = 0;
int byteCount = 0;
int i = 0;
int j = 0;
char temp[500];
u16 unicodeKey = 0;
u16 gbKey = 0;
//循环解析
while (i < len)
{
//delay(0);
switch (GetUtf8ByteNumForWord((u8)utf8[i]))
{
case 0:
temp[j] = utf8[i];
gbArray[k++] = gbKey;
byteCount = 1;
break;
case 2:
temp[j] = utf8[i];
temp[j + 1] = utf8[i + 1];
gbKey = ((utf8[i] & 0x80) << 8) + utf8[i + 1];
gbArray[k++] = gbKey;
byteCount = 2;
break;
case 3:
//这里就开始进行UTF8->Unicode
temp[j + 1] = ((utf8[i] & 0x0F) <<