您可能需要在这里进行实验。这是一个很好的问题,我不是 100% 有信心,但是:
那么 FAT-32 文件名的实际代码页是什么?这取决于创建 FAT 卷时的系统代码页?
“OEM 代码页”,无论用于系统。
FAT 能否支持真正的双字节字符集代码页,如 UTF-16?或者像 UTF-8 这样的多字节字符集代码页是限制?
不,我不相信 FAT 直接支持 UTF-16 或 UTF-8。也就是说,Microsoft 以带外方法存储 Unicode 文件名。因此,一个文件有两个文件名。(这也是您可以拥有超过 8.3 个字符的文件名的方法。)
还有更具体的问题:当我使用 CreateFileW 函数(如 MSDN 所述,使用 UTF-16 作为文件名代码页)在 FAT-32 卷上创建文件时会发生什么?
传递给的 Unicode 文件名CreateFileW
直接存储在带外文件名中。它被重新编码到 OEM 代码页中(无论系统上发生了什么)并放在那里。如果它无法转换为 OEM 代码页,或超过 8.3 个字符,Windows 将调用该文件,如FILENA~1.TXT
.
这些答案的一些引用:
首先,这个页面告诉我们 OEM 代码页 != Windows 代码页:
创建 FAT 文件的非 Unicode 应用程序有时必须使用标准 C 运行时库转换函数在 Windows 代码页字符集和 OEM 代码页字符集之间进行转换。使用文件系统函数的 Unicode 实现,没有必要执行这样的转换。
在典型的美国系统上,OEM 代码页是"CP437",但 Windows 代码页是Windows-1252(FooA
我相信,调用使用 Windows 代码页,通常是美国机器上的 Windows-1252,但取决于区域设置)。
如果您有可用的 FAT 卷,您可以看到这一点。字符“Σ”(U+03a3)在 Windows-1252 中不存在,但在 CP437 中存在。您可以使用 . 查看短文件名和长文件名dir /X
。使用名为 的文件asdfΣ.txt
,您将看到:
ASDFΣ.TXT asdfΣ.txt
但是,使用名为“asdfΛ.txt”的文件(Λ 在 CP437 或 Windows-1252 中均不存在),您将看到:
ASDF~1.TXT asdf?.txt
(您可能会看到?
,因为cmd.exe
的字体不能显示 Λ。)
有关长文件名的信息,请参阅此 Wikipedia 文章。
此外,有趣的是,如果您将文件命名为“asdf©.txt”,您可能会得到:
ASDFC.TXT asdfc.txt
......我在这里不是 100% 确定,但我认为 Windows 巧妙地决定用“c”代替 ©,并同样显示它。如果您将字体更改为不基于栅格的字体,例如 Consolas,您将看到:
ASDFC.TXT asdf©.txt
这就是您应该使用这些FooW
功能的原因。