嵌入式设备 ui侧 汉字字符编码转换 #GB2312# #utf-8# ##

本文讨论了嵌入式设备UI侧汉字字符编码转换的问题,特别是从UTF-8、Unicode或GB2312编码到设备显示格式的转换。在处理文本信息时,由于各种编码占用的字节不同,需要进行码值转换。以UTF-8为例,它需要3个字节来表示汉字,而Unicode和GB2312则只需2个字节。在使用如emwin的显示库时,通常要求输入UTF-8编码的文本。文章提供了源代码,适合对嵌入式设备汉字编码转换感兴趣的读者。
摘要由CSDN通过智能技术生成

嵌入式设备 ui侧 汉字字符编码转换

通常从sd卡等设备中读取的文件名或者文本信息,由于汉字编码的不同存在一些习惯上的不同。先从这个角度探讨问题:
通常从文本中读取到的文本信息常常为 utf8 或 unicode / gb2312等的汉字文本 其中一个,加上包含数字字母等等的ASCII码。这里需要一提的是,unicode和 gb2312在设备中常常看到的文本在字符流中占两个u8的位置,但是utf8需要三个u8的位置。因此在进行设备中进行字符串的解析和转换时需要进行码值的转换,由于互联网上关于这部分的描述非常少,尝试将这部分内容讲清楚:
首先读取到的字符流当存在需要展示的必要时,并在产品的终端上使用了emwin的方法去显示,但这个需要utf-8的字符文本。

不多说。看图:
两个不同文本的转码实现
源代码:

uint16_t SearchCodeTable_GB2312(uint16_t gbKey)
{
   
    uint16_t gb_temp_key = gbKey;
    gb_temp_key = gb_temp_key >> 8;
    if (gb_temp_key < 0xA1)
    {
   
        return gb_temp_key;
    }
    return find_to_binary_func(gbKey);
}

void gb2312_to_utf8_func(const char *source_buf, uint16_t source_buf_len, char *object_buf)
{
   
    uint16_t read_buf_index = 0;
    uint16_t write_buf_index = 0;
    uint16_t byteCount = 0;
    uint16_t gbKey = 0;
    uint32_t unicodeKey = 0;
    while(read_buf_index < source_buf_len){
   
        memcpy(&gbKey, (source_buf + read_buf_index), 2);
        gbKey=(gbKey >> 8) | (gbKey << 8);
        Debug_printf(disp_K, "gbKey = 0x%X.\r\n",gbKey);
        unicodeKey = SearchCodeTable_GB2312(gbKey);
        write_buf_index+=byteCount;
        byteCount = 0;
        //unicodeKey->utf-8
        if(unicodeKey==0)
        {
   
            Debug_printf(DISP_KEY_CODE, "fail:table can not find the key: 0x%x. \r\n",gbKey);
            object_buf[write_buf_index]=source_buf[read_buf_index];
            write_buf_index ++;
        }
        else
        {
   
            if(unicodeKey<=0x0000007F)
            {
   
                object_buf[write_buf_index]=unicodeKey&0x7F;
                byteCount = 1;
                read_buf_index ++;
                continue;
            }
            else 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值