ESP8266 Arduino 发送 GB2312 编码的中文到串口屏

文章讲述了作者如何在使用8266接收WebHook并显示在串口屏时,遇到UTF-8到GB2312编码转换问题,通过查阅资料和借鉴他人代码,实现了一个从UTF-8到GB2312的转换函数,解决了中文显示问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

屏幕预览

小项目使用8266接收WebHook,需要提取消息展示到串口屏

一切顺利,显示数量,图标,时间都很好

到了最后一步显示内容时碰壁了,Arduino发送的是UTF-8编码的

串口屏支持 GB2312 好一些,网上查了一番

有人用 char hello[] ={0xC4,0xE3,0xBA,0xC3} 直接定义编码数组的方式,可以展示一些固定的字符串文本

有人将文件编码从UTF-8改为ANSI

但这两种方法我都没有尝试,我们要展示的内容是接口收到的内容,内容不可控.不能改编码也是因为要从接口获取数据,修改了编码,请求数据又会出现问题

解决办法

最后在Github上,看到了一个别人几年前做的8266气象站:esp8266-weather-station

他的代码中用到了UTF-8GB2312,翻看代码后是网上的另一个思路,查表

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-8char数组转成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) << 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值