1
6
检测编码总是一件棘手的事情,但是UTF8 has strict bitwise rules about what values are expected in a valid sequence ,并且可以初始化UTF8Encoding对象 in a way that will fail by throwing an exception when these sequences are incorrect :
如果在一个zip中的所有文件名上运行,您可以确定它是否在任何地方失败,在这种情况下,您可以断定这些名称没有保存为UTF-8。
请注意,除了UTF-8之外,计算机的默认编码之间还有一个恼人的区别(
区分这些字符非常非常困难,可能需要实际检查超出字节0x80范围的每种编码是否产生正常的重音字符,以及这些字符通常不会在文件名中遇到的特殊字符。例如,许多DOS-437字符是用于在DOS中绘制半图形用户界面的帧。 以下是DOS-437中的特殊字符(因此字节范围为0x80-0xFF),以供参考: 80 Ãüéâäà åçêëèïîìÃà 90 ÃæÃôöòûùÿÃ⣥â§Æ A0 áÃóúñ꺿⬽¼¡«» B0 âââââ¤â¡â¢âââ£ââââââ C0 ââ´â¬âââ¼âââââ©â¦â ââ¬â§ D0 â¨â¤â¥âââââ«âªâââââââ E0 αÃÎÏΣϵÏΦÎΩδâÏε⩠F0 â¡Â±â¥â¤â â¡Ã·â°â·ââ¿Â²â 在Windows-1252中: 80 â¬ï¿½âÆââ¦â â¡Ëâ°Å â¹Å�Ž� 90 �âââââ¢ââËâ¢Å¡âºÅ�žŸ A0  ¡¢£¤¥¦§¨©ª«¬�®¯ B0 °±²³´µ¶·¸¹º»¼½¾¿ C0 ÃÃÃÃÃà ÃÃÃÃÃÃÃÃÃà D0 ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃà E0 à áâãäåæçèéêëìÃîï F0 ðñòóôõö÷øùúûüýþÿ 其中一些甚至不可打印,因此更容易打印。 如您所见,通常DOS-437的大多数重音字符位于0x80-0xA5区域(测试版为0xE1,在德国通常用作 eszett ),而Win-1252几乎所有这些都位于0xC0-0xFF区域。如果确定了这些区域,您可以创建一个扫描机制来评估它似乎倾向于哪种编码,只需计算每个区域的预期范围内外的数量。
请注意
|