Windows – FAT-32上的Unicode文件名?
据我所知 – NTFS支持Unicode文件名(UTF-16作为Micorsoft声明?). 但官方MSDN文档对于FAT-32上用于存储文件名(文件路径)的代码页非常模糊. 这里说OEM代码页(CP437我假设)用于存储文件名:http://msdn.microsoft.com/en-us/library/windows/desktop/dd317748.aspx 但是在这里,原来CP437可能会有不同的OEM代码,其中之一是:http://msdn.microsoft.com/en-us/library/windows/desktop/dd317752.aspx 而且我们现在所有的公用事业公司都像FAT一样支持更多不同的代码页,而不仅仅是OEM代码页. 那么FAT-32文件名的实际登录是什么?这取决于FAT卷创建时的系统代码页? FAT可以支持真正的双字节字符集代码页,如UTF-16?或多字节字符设置代码页如UTF-8是限制? 更具体的问题是:
“OEM代码页”,无论是系统.
不,我不相信FAT直接能够使用UTF-16或UTF-8.也就是说,Microsoft将Unicode文件名存储在带外方法中.一个文件因此有两个文件名. (这也是您可以拥有超过8.3个字符的文件名.)
传递给CreateFileW的Unicode文件名直接存储在带外文件名中.它被重新编码到OEM代码页(无论发生在系统上),并放在那里.如果不能将其转换为OEM代码页,或超过8.3个字符,Windows将调用文件FILENA?1.TXT. 这些答案的一些引用: 首先,this page告诉我们OEM代码页!= Windows代码页:
在典型的美国系统上,OEM代码页是“CP437”,但是Windows代码页是Windows-1252(FooA调用,我相信使用Windows代码页,通常是美国机器上的Windows-1252,但取决于语言环境). 如果您有一个FAT卷可用,您可以看到这一点. Windows-1252中不存在字符“Σ”(U 03a3),但是在CP437中.您可以使用dir / X查看短文件名和长文件名.使用一个名为asdfΣ.txt的文件,您将看到: ASDFΣ.TXT asdfΣ.txt 但是,使用名为“asdfΛ.txt”的文件(∧不在CP437或Windows-1252中),您将看到: ASDF~1.TXT asdf?.txt (你可能会看到?,因为cmd.exe的字体不能显示Λ.) 有关长文件名的信息,请参阅this Wikipedia article. 另外,有趣的是,如果你命名一个文件“asdf?.txt”,你可能会得到: ASDFC.TXT asdfc.txt …我不是100%肯定这里,但我认为Windows巧妙地决定替换“c”为?,并做同样的显示.如果将字体更改为不基于栅格的字体,例如Consolas,您会看到: ASDFC.TXT asdf?.txt 这就是为什么你应该使用FooW功能. (编辑:ASP站长网) |