但官方MSDN文档对于FAT-32上用于存储文件名(文件路径)的代码页非常模糊.
这里说OEM代码页(CP437我假设)用于存储文件名:@L_301_0@
但是在这里,原来CP437可能会有不同的OEM代码,其中之一是:http://msdn.microsoft.com/en-us/library/windows/desktop/dd317752.aspx
而且我们现在所有的公用事业公司都像FAT一样支持更多不同的代码页,而不仅仅是OEM代码页.
那么FAT-32文件名的实际登录是什么?这取决于FAT卷创建时的系统代码页? FAT可以支持真正的双字节字符集代码页,如UTF-16?或多字节字符设置代码页如UTF-8是限制?
更具体的问题是:
当我使用CreateFileW功能(MSDN状态,使用UTF-16作为文件名代码页)在FAT-32卷上创建文件时会发生什么?
So what is the actual codepage for FAT-32 filenames? It depends on the system codepage at the time when FAT volume was created?
“OEM代码页”,无论是系统.
Can FAT support true Double Byte Character Set codepages like UTF-16? Or Multi Byte Character Set codepages like UTF-8 is the limit?
不,我不相信FAT直接能够使用UTF-16或UTF-8.也就是说,Microsoft将Unicode文件名存储在带外方法中.一个文件因此有两个文件名. (这也是您可以拥有超过8.3个字符的文件名.)
And more specific question: What happens when I use CreateFileW function (which,as MSDN states,use UTF-16 as filename codepage) to create a file on FAT-32 volume?
传递给CreateFileW的Unicode文件名直接存储在带外文件名中.它被重新编码到OEM代码页(无论发生在系统上),并放在那里.如果不能将其转换为OEM代码页,或超过8.3个字符,Windows将调用文件FILENA〜1.TXT.
这些答案的一些引用:
首先,this page告诉我们OEM代码页!= Windows代码页:
Non-Unicode applications that create FAT files sometimes have to use the standard C runtime library conversion functions to translate between the Windows code page character set and the OEM code page character set. With Unicode implementations of the file system functions,it is not necessary to perform such translations.
在典型的美国系统上,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功能.