问题出自《批处理有什么办法处理unicode字符?》一帖,摘录如下:
批处理有办法处理unicode字符吗? 例如: "☀☁☂☃☭☄☢" 的这些字符
如果我要用批处理建这样的一个文件夹:复制代码 复制代码直接这样批处理是不会运行,有办法解决吗?
qzwqzw的回复
问题似乎无解
批处理必须以ANSI编码保存
否则cmd无法正常处理
而中文locale下的ANSI对应的GBK字符集
是没有楼主所提到的那些字符的
然后楼主就结帖了。
真的无法实现吗?对于权威我们要敢于怀疑,在无数次Google无数次链接被重置之后,我似乎找到了答案。
“批处理必须以ANSI编码保存,否则cmd无法正常处理”,真的是这样吗?把下面代码保存为utf-8.bat,保存时选择UTF-8编码复制代码 注:不要使用记事本保存,因为记事本保存UTF-8编码时会自动在文件前加上BOM(Byte Order Mark),即十六进制的EFBBBF,影响批处理的解析。推荐使用EditPlus,下载地址:http://www.editplus.com/download.html,注册码在线生成:http://demon.tw/my-work/editplus-regcode-online.html。
打开命令提示行,切换到utf-8.bat所在目录,运行之,输出:- C:\Users\Demon\Desktop>utf-8.bat
- 浣犲ソ
复制代码 输出乱码而不是预期的“你好”,为什么会这样呢?因为“中文locale下的ANSI对应的GBK字符集”,即代码页936。cmd.exe在解析批处理命令时是按照默认代码页的编码来解析的。众所周知,所有的文件都是以二进制的形式保存的,但是同样的二进制序列用不同的编码来解析得到的结果是不一样的,例如:复制代码 如果以UTF-8编码来解析是“你好”,而用GBK来解析是“浣犲ソ”,即上面输出的结果。
于是想到了用chcp来切换代码页,65001代码页对应的是UTF-8编码,于是输入:- C:\Users\Demon\Desktop>chcp 65001
- Active code page: 65001
- C:\Users\Demon\Desktop>utf-8.bat
- The system cannot write to the specified device.
复制代码 结果却令人失望,也并不是预期的“你好”,Google了半天,传说是raster font(点阵字体)搞的鬼,于是右键单击命令提示行的标题栏,选择属性,将字体改成Lucida Console,确定,再次输入:- C:\Users\Demon\Desktop>utf-8.bat
- 你好
复制代码 得到了我们想要的输出,因为经过刚才的修改,cmd.exe已经将默认代码页改成65001了(注:但是右键属性中仍然显示936),解析批处理文件的时候使用的也是用UTF-8,所以能正确输出。于是下面代码也能正常运行(保存为UTF-8编码):复制代码 但是这样并没有可移植性性,因为需要手动修改cmd.exe的设置,幸运的是,cmd.exe的设置是保存在注册表的,在Windows 7系统(其他系统可能会不一样)可以通过导入下面.reg文件进行设置:- Windows Registry Editor Version 5.00
-
- [HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
- "CodePage"=dword:0000fde9
- "WindowSize"=dword:00180050
- "FontSize"=dword:000c0000
- "FontFamily"=dword:00000036
- "FontWeight"=dword:00000190
- "FaceName"="Lucida Console"
复制代码 以上代码在Windows 7 Ultimate 英文版下通过测试,欢迎各位高手指点和补充。
参考链接(排名不分先后):
1、http://blogs.msdn.com/b/michkap/archive/2008/03/18/8306597.aspx
2、http://stackoverflow.com/questio ... -if-chcp-was-called
3、http://stackoverflow.com/questio ... irection-on-cmd-exe |