我在写一个胖文件系统解析器。那些不知道或不太关心这个主题的人,由于对原始FAT的扩展,FAT文件名处理非常复杂。文件总是有大写的短名称。如果文件名实际上很短,并且是大写的,那么这是文件唯一的名称,比如食品.TXT. 相反,如果文件名超过8个字符,或者名称是大写和小写的混合,则会有另一个名称,即16位unicode。在
当构造一个文件的路径时,它当然是由每个子目录的名称和文件名组成的。我需要将这些名称与来自sqlite数据库的其他名称进行比较。我的比较从不匹配,当我更深入地查看数据时,我发现文件名字符串就是这样
/FOO/PUP/M^@o^@u^@n^@t^@i^@n^@g^@
。。。在
因为我必须使用长的unicode名称(如果有的话)。当一些字符是8位,有些是16位时,我无法将任何内容与该字符串匹配。我无法摆脱16位unicode,因为文件名可能包含unicode字符。在
我建议的解决方案是强制所有内容都使用16位unicode,并尝试对它们进行比较。我该怎么做?如果我声明unicode("FOO", errors="strict")
,我仍然只得到8位字符(当遇到文件名为0xE5的已删除文件时,由于strict而崩溃)。在
或者有没有办法把16位unicode字符转换成西方的ascii码?这样会更好。在
unicode(byte_string, errors="strict")
使用当前默认编码对传递给它的字节字符串进行解码。这不太可能与您的数据编码匹配。在西方窗口,它通常是iso8859-1,也就是拉丁语-1。但脂肪中的数据是UTF-16,little-endian。在因此,您应该使用
encoding
参数显式指定正确的编码:只需确保用Unicode进行所有比较。当然,你必须知道数据的原始编码。以下是相同Unicode字符的四种不同编码:
尽快将每个文本字符串转换为Unicode。当再次写出数据时,将其编码为您首选的编码。在
关于使用
^{pr2}$\xE5
删除的文件,首先处理原始数据以确定它是否是已删除的条目。无需将已删除的文件处理为Unicode:编辑
今天下午我很无聊,这里有一个简短的FAT32解析器。它并没有严格遵循FAT32 spec这仅仅是为了说明解码:
从支持UTF-8的IDE(不是Windows控制台)输出:
相关问题 更多 >
编程相关推荐