当前位置:DOS资源站资料中心批处理教程 → Unicode与ANSI的相互转换

Unicode与ANSI的相互转换

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2008-5-27 17:28:19

很多命令比如findstr、for都不能识别Unicode格式的文件,而我们经常处理的文件有不少是Unicode格式,比如注册表导出文件,如果直接用for解析,结果将不会得到任何输出。

但有少数命令如find、more、type可以识别,利用这些命令可以把Unicode格式转换为ANSI格式,方法就是用这些命令读取文件,然后重定向到新文件,结果就是ANSI格式。比如一个最常用的命令:
type Unicode > ANSI

用for解析Unicode文件时也常借用type:
for /f "delims=" %%a in ('type a.reg') do ...


利用上面的方法可以很容易地将Unicode转换为ANSI,但如何将ANSI转换为Unicode呢?

C:\Documents and Settings\user\桌面>cmd /?
启动 Windows XP 命令解释程序一个新的实例

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
    [[/S] [/C | /K] string]

/C      执行字符串指定的命令然后终断
/K      执行字符串指定的命令但保留
/S      在 /C 或 /K 后修改字符串处理(见下)
/Q      关闭回应
/D      从注册表中停用执行 AutoRun 命令(见下)
/A      使向内部管道或文件命令的输出成为 ANSI
/U      使向内部管道或文件命令的输出成为 Unicode
/T:fg   设置前景/背景颜色(详细信息,请见 COLOR /?)
/E:ON   启用命令扩展(见下)
/E:OFF  停用命令扩展(见下)
/F:ON   启用文件和目录名称完成字符 (见下)
/F:OFF  停用文件和目录名称完成字符(见下)
/V:ON   将 ! 作为定界符启动延缓环境变量扩展。如: /V:ON 会
        允许 !var! 在执行时允许 !var! 扩展变量 var。var 语法
        在输入时扩展变量,这与在一个 FOR 循环内不同。
/V:OFF  停用延缓的环境扩展。
...
CMD默认是ANSI

利用/u开关,再借助重定向,就能达到我们的目的。

比如:

cmd /u "echo 你好>u.txt"

cmd /u "type ANSI > Unicode"

此方法有一个问题,如果待转换的ANSI格式文件较大,生成的Unicode文件用记事本打开会出现乱码(可能是CMD生成的Unicode格式与Windows下的有兼容性问题)。解决办法是用word打开,打开时编码选择Unicode。或者用其他能选择编码的编辑器打开,比如Notepad2。


注意:即使运行cmd时使用了/u开关,原来不识别Unicode格式的命令如for等仍然不识别,还是要借助于识别Unicode格式的命令

下面是一个转换ANSI到Unicode的批处理:


@echo off
setlocal EnableDelayedExpansion
if "%~1"=="" (
   echo 可以直接把要转换的文件拖到此脚本上
   echo.
   set /p file=输入文件路径或直接拖到这里→
   set file=!file:"=!
   start /b cmd /u /c "%~s0 "!file!""
   goto :eof
)
if not "%2"=="" (
   for /f "tokens=1* delims=:" %%a in ('findstr /n .* %1') do (
      set "line=%%b"
      echo.!line!
   )
   goto :eof
)
start /b cmd /u /c "%~s0 %~s1 a2u>"%~dpn1.u%~x1""