Board logo

标题: [文本处理] 怎么样只用批处理命令就实现ANSI-UTF8的互换 [打印本页]

作者: ckz1211    时间: 2017-4-16 12:02     标题: 怎么样只用批处理命令就实现ANSI-UTF8的互换

搜到这贴
https://noelwei.wordpress.com/2011/04/11/%E6%80%8E%E4%B9%88%E6%A0%B7%E5%8F%AA%E7%94%A8%E6%89%B9%E5%A4%84%E7%90%86%E5%91%BD%E4%BB%A4%E5%B0%B1%E5%AE%9E%E7%8E%B0ansi-utf8%E7%9A%84%E4%BA%92%E6%8D%A2/
但郁闷的是,测试失败了!
cmd /u /c type ansi.txt>unicode.txt
这一步输出的unicode.txtl里全是乱码……

我搜了类似的网页,貌似有些人靠这个能成功输出无乱码的unicode文件,我就纳闷,是不是自己系统出问题了?
我的系统是Win7 x64
作者: ShowCode    时间: 2017-4-18 15:39

  1. @echo off
  2. powershell -c "Get-Content 1.txt | Out-File -Encoding unicode 2.txt"
复制代码

作者: 老刘1号    时间: 2017-4-23 10:46

楼主……
Unicode和UTF8编码是不一样的
作者: nwm310    时间: 2017-4-23 19:40

回复 1# ckz1211

Win10 測試OK
  1. ::先輸出一個Unicode檔案
  2. reg  export  HKCR\.txt  U.bom
  3. ::取得 Unicode BOM
  4. chcp 1252
  5. set /p BOM=<U.bom
  6. set /p=%BOM:~0,2%<nul  >U.bom
  7. ::ansi → Unicode
  8. chcp 936
  9. copy  U.bom  Unicode.txt
  10. cmd /u /c "type ansi.txt >>Unicode.txt"
  11. ::=======================================
  12. chcp 65001
  13. ::Unicode → 無BOM的UTF-8
  14. type Unicode.txt > UTF-8-0.txt
  15. ::Unicode → 有BOM的UTF-8
  16. copy /b U.bom + Unicode.txt  Unicode-2B.txt
  17. type Unicode-2B.txt > UTF-8-B.txt
  18. ::=======================================
  19. ::無BOM的UTF-8 → Unicode
  20. copy  U.bom  Unicode-save-0.txt
  21. cmd /u /c  "type  UTF-8-0.txt >> Unicode-save-0.txt"
  22. ::有BOM的UTF-8 → Unicode
  23. cmd /u /c  "type  UTF-8-B.txt > Unicode-save-1.txt"
  24. ::========================================
  25. ::Unicode → ansi
  26. chcp 936
  27. type Unicode-save-0.txt > ansi-save-0.txt
  28. type Unicode-save-1.txt > ansi-save-1.txt
复制代码

作者: muink    时间: 2018-6-18 20:07

取得 Unicode BOM 部分也可以这么写,但仅限win7及以上系统
  1. echo.//4=>U.bom
  2. certutil -decode -f U.bom U.bom>nul
复制代码

作者: CrLf    时间: 2018-6-18 23:57

本帖最后由 CrLf 于 2018-6-19 00:17 编辑

现在的选择太多,已经没什么必要纠结于纯批了
秀一块来自中古时期的肌肉(ANSI->UNICODE),文件头获取方式和 4 楼不同,但借鉴 4 楼方案对 plp 的方案改进:
  1. @ECHO off&setlocal EnableDelayedExpansion
  2. Set gbk=绿图
  3. chcp 1252 >nul
  4. for /f %%a in ('cmd/u/cecho !gbk!')do set un=%%a
  5. Set head=!un:~0,1!!un:~2,1!
  6. set/p=!head!<nul>U.bom
  7. chcp 936
  8. copy /b /y U.bom 转换后.txt
  9. cmd /u /c type 转换前.txt >>转换后.txt
  10. pause
复制代码
参考:http://www.bathome.net/redirect. ... 12347&pid=79254


1252 代码页真是个好东西,如果用 437,就得用 findstr 过滤才能生成干净的文件头:
  1. @ECHO off&setlocal EnableDelayedExpansion
  2. Set gbk=绿图
  3. chcp 437>nul
  4. for /f %%a in ('cmd/u/cecho !gbk!')do set un=%%a
  5. Set head=!un:~0,1!!un:~2,1!
  6. set/p=@^
  7. !head!<nul>$
  8. chcp 936
  9. findstr /v @ $>c1.txt
  10. cmd /u /c type a.txt >>c1.txt
  11. pause
复制代码
----------------------------------------------------------------------------
那段时间,关于纯批真是出现了好多有趣的话题呢
后来大家发现纯批技巧只是在秀肌肉,无法从根本上解决问题,就开始各种杂交了...
好多压箱底的纯批技巧都已经忘了,这么多年都没找到合适的用途,再精巧的构思也没意义
也对,本质上,shell 就是各取其长么
作者: gao_leyun_km    时间: 2020-5-12 17:30

本帖最后由 gao_leyun_km 于 2020-5-12 17:44 编辑

纯批,转换将删除所有空行和所有行首鸣声符(一般不会存在),支持含有特殊字符的文件。
(也可以在第一个for循环中加上findstr命令改造成可以转换空行的脚本,但如果被转换文件行首有冒号就会被删除)
下面的BAT要保存为ANSI编码。
  1. @echo off
  2. :Load
  3. if exist "%~1" goto Read
  4. cls&echo 未指定或指定的源文件不存在。请拖拽文件入内并按下回车键,或以文件完整路径为第一个参数(%%1)重新运行本批处理。
  5. set /p S=
  6. call :Load "%S:"=%"
  7. :Read
  8. set F="%~dp1%~n1_ANSI%~x1"
  9. if exist %F% del %F%
  10. set I=原始文件:"%~1"&set O=目标文件:%F%&set T0=#    注意:&set T1=#    转换过程中不会更改原始文件。&set T2=#    输出文件中将删除所有并在末尾创建一空白行。&set T3=#    每行开头的鸣声符(如果存在的话)将被删除。&set T4=#    不能识别的字符将输出问号。&set W=#    请稍等。
  11. >nul chcp 65001
  12. set Str=Str_%date:~3%_%time: =0%
  13. for /f "usebackq delims=" %%i in ("%~1") do >nul set %Str%=%%i&call :Convert
  14. start notepad.exe %F%
  15. ping 127.1 -n 1 >nul
  16. exit
  17. :Convert
  18. if not defined N >nul chcp 936&echo %I%&echo %O%&echo;&echo %T0%&echo;&echo %T1%&echo %T2%&echo %T3%&echo %T4%&echo;&<nul set /p =%W%&set N=1
  19. for /f "tokens=1* delims=" %%j in ('set %Str%') do >>%F% echo;%%k
  20. goto :eof
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2