找回密码
 立即注册
查看: 322|回复: 2

UTF-8转GBK遇到的问题【已解决】

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-02-15 09:09:48
已绑定手机

8

主题

26

回帖

306

积分

中级会员

积分
306
发表于 2024-12-25 19:46:02 | 显示全部楼层 |阅读模式

根据这个文章学习
QQ20241225-203157.png

遇到的问题是
Snipaste_2024-12-25_19-22-38.png

有些Unicode转到GBK会转换失败

/*

  • 功能:Unicode与GBK编码相互转换

  • 参数:

  • gbk 需要转换的Unicode字符代码

  • dir 转换方向,0:Unicode转GBK,1:GBK转Unicode

  • 返回值:ff_convert 转换后的GBK代码,0表示转换错误
    */
    u16 ff_convert(u16 gbk, bit dir)
    {
    u16 t[2]; // 临时存储从FLASH读取的数据
    u16 c; // 存储转换后的字符代码
    u32 i, li, hi; // 循环和比较用的变量
    u16 n; // 存储查找到的数组索引
    u32 gbk2uni_offset; // GBK转Unicode数组的偏移量
    u32 ugbksize, ugbkaddr; // Unicode转GBK数组的长度和存储地址

    ugbksize = 87172; // Unicode转GBK数组的长度
    ugbkaddr = 0x400000; // Unicode转GBK数组在FLASH中的地址

    if (gbk < 0x80)
    {
    c = gbk; // ASCII字符,不需要转换
    }
    else {

     if (dir) 
     		{ 																	// GBK转Unicode
         gbk2uni_offset = ugbksize / 2; 	// 计算GBK转Unicode数组的偏移量
     } 
     		else 
     		{ 																	// Unicode转GBK
         gbk2uni_offset = 0; 						// Unicode转GBK数组没有偏移
     }
    

// 二分查找Unicode字符对应的GBK编码或GBK字符对应的Unicode编码
hi = ugbksize / 2; // 数组中间位置
hi = hi / 4 - 1; // 调整索引以适应数组存储格式
li = 0;
for (n = 16; n; n--)
{ // 最多查找16次
i = li + (hi - li) / 2; // 计算中间索引
W25Q64_R_Data((u8*)&t, ugbkaddr +( i * 4) + gbk2uni_offset, 4); // 从FLASH读取4个字节的数据
if (gbk == t[0]) break; // 找到匹配的字符
if (gbk > t[0]) li = i; // 调整查找范围
else hi = i;
}
c = n ? t[1] : 0; // 如果找到匹配项,取第二个字节作为结果,否则返回0表示错误
}
return c; // 返回转换后的字符代码
}

代码放在这里 ff_convert这个函数是FATFS里的CC936.h,有一个87172的数组,已经存入W25Q64中首地址为0x400000,用的串行FLASH工具烧录 校验合格。

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-02-15 09:09:48
已绑定手机

8

主题

26

回帖

306

积分

中级会员

积分
306
发表于 2024-12-26 14:14:50 | 显示全部楼层

更新一下,下面的是U2G数组,左边是bin文件,右边是原本数组txtSnipaste_2024-12-26_14-06-11.png

使用的是大端模式存放,下面贴出小端模式的存放
Snipaste_2024-12-26_14-10-32.png

不清楚是不是数组格式有问题。

Snipaste_2024-12-26_14-13-47.png

更新一下函数

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-02-15 09:09:48
已绑定手机

8

主题

26

回帖

306

积分

中级会员

积分
306
发表于 2024-12-27 17:28:19 | 显示全部楼层

好的,原来是超界了,将i设置为U32即可,但是目前发现应该是有小部分文字没法正确查表的
Snipaste_2024-12-27_17-27-57.png

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-9 21:44 , Processed in 0.113590 second(s), 64 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表