MQX如何支持中文长文件名(How to use long Chinese filename on MQX)

Document created by Weihua Liang Employee on Oct 16, 2013Last modified by Weihua Liang Employee on Nov 12, 2013
Version 2Show Document
  • View in full screen mode

作者 Shaozhong Liang

        MQX4.0支持长文件名(Long FileName),但不支持中文长文件名。在MQX创建长文件名的文件时,只是简单地将文件名对应的字符串由转换为UNICODE编码。

        如果使用的是拉丁字母,其编码将会被补全为2个字节,前面一个字节为0x00,例如字符“A”的编码是0x0041,是0x00接上字符对应的ASCII码。这个编码方式在英文字符串上编解码不成问题。

        但是中文的表示方式是以GB2312编码方式,用2个字节来表示一个中文字。

        例如中文字“啊”,对应的GB2312码为0xB0A1,MQX会将这2个字节拆分为0xB0和0xA1,然后分别进行UNICODE编码,这时候“啊”的编码将是0x00B0,0x00A1,变成4个字节的UNICODE编码。

        最终将导致错误乱码,“啊”因此会被译码显示成  °  和  ¡

        而实际上“啊”在UNICODE编码为0x554A,为了MQX能够支持中文长文件名,此时我们需要对GB2312和UNICODE进行转换。

        我们需要对MFS源代码进行修改。现在修改后的代码只支持创建文件,暂时不支持修改已经存在的中文长文件名文件。

        将附件中的文件替换原有的文件,重新编译MFS库和应用程序即可。

        按照这种方法修改后,对中文字对应的GB2312编码范围进行UNICODE的转换,处理后文件名将支持中文,同时也可以实现中英文文件名的混用。


mfs\source\generic\mfs_entry.c

修改了函数MFS_create_directory_entry

mfs\source\generic\mfs_lfn.c

增加了长文件名保存函数MFS_lfn_save

增加了oem字符集到unicode字符集的转换函数MFS_oem2unicode,用户层的代码直接使用中文文件名,有转换函数转换为对应的UNICODE编码。

由于GB2312全集占用空间太大,用户可以将gb2unicode.c的字符集表oem2unicode_table中数据进行精简。

mfs\source\include\mfs_prv.h

增加了上述函数声明。

6297_776_393_cache.bmp

Attachments

Outcomes