嵌入式设备 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