根据这个文章学习

的
遇到的问题是

有些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工具烧录 校验合格。