我面临一个奇怪的问题。我在 Windows 命令提示符中看到,每个“/”字符都被一个垃圾字符(日元符号)替换。我选择了两种字体类型“MS Gothic”和“Raster”。但同样的问题。如果我使用 Raster,问题是间歇性的。请让我知道如何解决问题。
谢谢,纳迦
我面临一个奇怪的问题。我在 Windows 命令提示符中看到,每个“/”字符都被一个垃圾字符(日元符号)替换。我选择了两种字体类型“MS Gothic”和“Raster”。但同样的问题。如果我使用 Raster,问题是间歇性的。请让我知道如何解决问题。
谢谢,纳迦
chcp
在命令提示符下输入,我打赌你会看到Active code page: 932
Windows 控制台具有代码页的概念,这是 unicode 时代的遗迹,其中字节 0-255 映射到不同的字符,具体取决于语言。虽然字符 az、AZ、0-9 是一致的,但较少使用的字符映射到目标语言中流行的字符。
在代码页 932中,反斜杠映射到日元字符。
这是一个常见的问题。请参阅Microsoft 在 MSDN 上的说明:
注意 日语操作系统上使用的 Windows 代码页和 OEM 代码页字符集包含日元符号 (¥) 而不是反斜杠 ()。因此,日元符号是 NTFS 和 FAT 文件系统的禁止字符。将 Unicode 映射到日语代码页时,WideCharToMultiByte 和其他转换函数将反斜杠 (U+005C) 和正常的 Unicode 日元符号 (U+00A5) 映射到同一字符。出于安全原因,您的应用程序通常不应允许 Unicode 字符串中的字符 U+00A5 可能被转换为 FAT 文件名。有关详细信息,请参阅安全注意事项:国际功能。
更新
抱歉耽搁了,我花了一点时间才想起我最初是在哪里读到的。最好的参考是 Mike Kaplan的博客条目。michkap 是关于所有 unicode 的最佳 Microsoft 博客。如果您处理字符集、编码问题和国际化的阴暗角落,他的博客是必不可少的参考。
从他对日元字符作为反斜杠的条目中:
...在日语代码页 932 上,0x5c 是日元符号,在韩语代码页 949 上,0x5c 是 WON 符号。
这并不是说 0x5c 不能充当路径分隔符——它仍然可以。这也不是说日元和韩元的 Unicode 代码点(U+00a5 和 U+20a9)确实充当了路径分隔符——因为它们没有。
...
在实践中,在日本和韩国多年来使用各自的货币符号作为路径分隔符的基于代码页的系统之后,相信客户已经习惯了这种外观。因此,除了那些符号之外,几乎没有兴趣将外观(当系统设置为日文或韩文时)更改为其他任何东西。
为了支持这种预期,当默认系统区域设置分别设置为日文或韩文时,日文和韩文字体将在显示 U+005c 时显示货币符号而不是反斜杠。
我相信你会很难找到比那个更好的参考。
Yen 和 \ 字符都有字节值 0x5C,只是在不同的字符集中。这很常见,以至于日本人普遍意识到这一点,并且不认为这是一个问题。
请参阅此博客文章的评论部分- Norman Diamond 在 2004 年 12 月 27 日凌晨 1:45 写道“Windows 路径使用日本默认系统区域设置,因为 0x5c 是日元符号,日元符号是路径分隔符。”(诺曼在日本)