[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [分享]批处理用chcp 65001处理Unicode字符

问题出自《批处理有什么办法处理unicode字符?》一帖,摘录如下:
批处理有办法处理unicode字符吗? 例如: "☀☁☂☃☭☄☢" 的这些字符
如果我要用批处理建这样的一个文件夹:
  1. md .\文件夹☁
复制代码
复制代码直接这样批处理是不会运行,有办法解决吗?


qzwqzw的回复
问题似乎无解
批处理必须以ANSI编码保存
否则cmd无法正常处理
而中文locale下的ANSI对应的GBK字符集
是没有楼主所提到的那些字符的

然后楼主就结帖了。

真的无法实现吗?对于权威我们要敢于怀疑,在无数次Google无数次链接被重置之后,我似乎找到了答案。

“批处理必须以ANSI编码保存,否则cmd无法正常处理”,真的是这样吗?把下面代码保存为utf-8.bat,保存时选择UTF-8编码
  1. @echo 你好
复制代码
注:不要使用记事本保存,因为记事本保存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所在目录,运行之,输出:
  1. C:\Users\Demon\Desktop>utf-8.bat
  2. 浣犲ソ
复制代码
输出乱码而不是预期的“你好”,为什么会这样呢?因为“中文locale下的ANSI对应的GBK字符集”,即代码页936。cmd.exe在解析批处理命令时是按照默认代码页的编码来解析的。众所周知,所有的文件都是以二进制的形式保存的,但是同样的二进制序列用不同的编码来解析得到的结果是不一样的,例如:
  1. E4 BD A0 E5 A5 BD
复制代码
如果以UTF-8编码来解析是“你好”,而用GBK来解析是“浣犲ソ”,即上面输出的结果。

于是想到了用chcp来切换代码页,65001代码页对应的是UTF-8编码,于是输入:
  1. C:\Users\Demon\Desktop>chcp 65001
  2. Active code page: 65001
  3. C:\Users\Demon\Desktop>utf-8.bat
  4. The system cannot write to the specified device.
复制代码
结果却令人失望,也并不是预期的“你好”,Google了半天,传说是raster font(点阵字体)搞的鬼,于是右键单击命令提示行的标题栏,选择属性,将字体改成Lucida Console,确定,再次输入:
  1. C:\Users\Demon\Desktop>utf-8.bat
  2. 你好
复制代码
得到了我们想要的输出,因为经过刚才的修改,cmd.exe已经将默认代码页改成65001了(注:但是右键属性中仍然显示936),解析批处理文件的时候使用的也是用UTF-8,所以能正确输出。于是下面代码也能正常运行(保存为UTF-8编码):
  1. md .\文件夹☁
复制代码
但是这样并没有可移植性性,因为需要手动修改cmd.exe的设置,幸运的是,cmd.exe的设置是保存在注册表的,在Windows 7系统(其他系统可能会不一样)可以通过导入下面.reg文件进行设置:
  1. Windows Registry Editor Version 5.00
  2. [HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
  3. "CodePage"=dword:0000fde9
  4. "WindowSize"=dword:00180050
  5. "FontSize"=dword:000c0000
  6. "FontFamily"=dword:00000036
  7. "FontWeight"=dword:00000190
  8. "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
6

评分人数

返回列表