omnsvwle 发表于 2024-12-25 19:46:02

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

<p>根据这个文章学习<br />
<img src="data/attachment/forum/202412/25/203216cnsqmoqkstj2zs0q.png" alt="QQ20241225-203157.png" title="QQ20241225-203157.png" /><br />
的</p>
<p>遇到的问题是<br />
<img src="data/attachment/forum/202412/25/192302kdilhxxhhlmhxoz3.png" alt="Snipaste_2024-12-25_19-22-38.png" title="Snipaste_2024-12-25_19-22-38.png" /></p>
<p>有些Unicode转到GBK会转换失败</p>
<p>/*</p>
<ul>
<li>
<p>功能:Unicode与GBK编码相互转换</p>
</li>
<li>
<p>参数:</p>
</li>
<li>
<p>gbk需要转换的Unicode字符代码</p>
</li>
<li>
<p>dir转换方向,0:Unicode转GBK,1:GBK转Unicode</p>
</li>
<li>
<p>返回值:ff_convert 转换后的GBK代码,0表示转换错误<br />
*/<br />
u16 ff_convert(u16 gbk, bit dir)<br />
{<br />
u16 t;                                                                                                 // 临时存储从FLASH读取的数据<br />
u16 c;                                                                                                                 // 存储转换后的字符代码<br />
u32 i, li, hi;                                                                                 // 循环和比较用的变量<br />
u16 n;                                                                                                                 // 存储查找到的数组索引<br />
u32 gbk2uni_offset;                                                         // GBK转Unicode数组的偏移量<br />
u32 ugbksize, ugbkaddr;                                   // Unicode转GBK数组的长度和存储地址</p>
<p>ugbksize = 87172;                                                                 // Unicode转GBK数组的长度<br />
ugbkaddr = 0x400000;                                                         // Unicode转GBK数组在FLASH中的地址</p>
<p>if (gbk &lt; 0x80)<br />
{<br />
c = gbk;                                                                                         // ASCII字符,不需要转换<br />
}<br />
else {</p>
<pre><code> if (dir)
                {                                                                                                                                         // GBK转Unicode
   gbk2uni_offset = ugbksize / 2;         // 计算GBK转Unicode数组的偏移量
}
                else
                {                                                                                                                                         // Unicode转GBK
   gbk2uni_offset = 0;                                                 // Unicode转GBK数组没有偏移
}
</code></pre>
</li>
</ul>
<p>// 二分查找Unicode字符对应的GBK编码或GBK字符对应的Unicode编码                                                                                                                                                <br />
hi = ugbksize / 2;                                                                         // 数组中间位置<br />
hi = hi / 4 - 1;                                                                                 // 调整索引以适应数组存储格式<br />
li = 0;<br />
for (n = 16; n; n--)<br />
{                                                                                                                                         // 最多查找16次<br />
i = li + (hi - li) / 2;                                 // 计算中间索引<br />
W25Q64_R_Data((u8*)&amp;t, ugbkaddr +( i * 4) + gbk2uni_offset, 4); // 从FLASH读取4个字节的数据<br />
if (gbk == t) break;                                 // 找到匹配的字符<br />
if (gbk &gt; t) li = i;                                 // 调整查找范围<br />
else hi = i;<br />
}<br />
c = n ? t : 0;                                                                         // 如果找到匹配项,取第二个字节作为结果,否则返回0表示错误<br />
}<br />
return c;                                                                                                                         // 返回转换后的字符代码<br />
}</p>
<p>代码放在这里 ff_convert这个函数是FATFS里的CC936.h,有一个87172的数组,已经存入W25Q64中首地址为0x400000,用的串行FLASH工具烧录 校验合格。</p>

omnsvwle 发表于 2024-12-26 14:14:50

<p>更新一下,下面的是U2G数组,左边是bin文件,右边是原本数组txt<img src="data/attachment/forum/202412/26/140652lrnyvhc3vci7mnri.png" alt="Snipaste_2024-12-26_14-06-11.png" title="Snipaste_2024-12-26_14-06-11.png" /></p>
<p>使用的是大端模式存放,下面贴出小端模式的存放<br />
<img src="data/attachment/forum/202412/26/141116gadj18ljzstawjfq.png" alt="Snipaste_2024-12-26_14-10-32.png" title="Snipaste_2024-12-26_14-10-32.png" /></p>
<p><strong>不清楚是不是数组格式有问题。</strong></p>
<p><img src="data/attachment/forum/202412/26/141411pplj3lal1op03pb1.png" alt="Snipaste_2024-12-26_14-13-47.png" title="Snipaste_2024-12-26_14-13-47.png" /></p>
<p>更新一下函数</p>

omnsvwle 发表于 2024-12-27 17:28:19

<p>好的,原来是超界了,将i设置为U32即可,但是目前发现应该是有小部分文字没法正确查表的<br />
<img src="data/attachment/forum/202412/27/172811onq5wqv0vqggvw7p.png" alt="Snipaste_2024-12-27_17-27-57.png" title="Snipaste_2024-12-27_17-27-57.png" /></p>
页: [1]
查看完整版本: UTF-8转GBK遇到的问题【已解决】