37代码页对应的是EBCDIC 037,与我们常见的ASCII相差很大。
维基百科上有EBCDIC 037与Unicode的映射表http://en.wikipedia.org/wiki/EBCDIC_037
第一行代码中的chcp 37命令将当前的代码页切换成了EBCDIC 037,这样CMD在调用MultiByteToWideChar函数将第二行代码转换成Unicode时就会使用37代码页,
类似于这样:- MultiByteToWideChar(37, MB_PRECOMPOSED, "in ", 3, Buf, 8191);
复制代码 "in "用十六进制表示为69 6E 20,通过查表(上面的维基百科链接)可知
EBCDIC 037的第105(0x69)个字符为Ñ,对应的Unicode代码点为U+00D1
EBCDIC 037的第110(0x6E)个字符为>,对应的Unicode代码点为U+003E
EBCDIC 037的第32(0x20)个字符为不可打印字符,对应的Unicode代码点为U+0080
所以转成Unicode后的代码为Ñ>[\x0080],文件名只是无法显示的U+0080,并不是空格U+0020
空格(0x20) 分号(0x3B) 逗号(0x2C) 冒号(0x3A) 井号(0x23)在EBCDIC 037下分别对应U+0080 U+009B U+008C U+009A U+0083,
所以得到的是5个不同名称的文件,只不过这些字符都无法显示,看起来一样罢了。 |