标题: [文本处理] 怎么样只用批处理命令就实现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
- @echo off
- 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- ::先輸出一個Unicode檔案
- reg export HKCR\.txt U.bom
-
- ::取得 Unicode BOM
- chcp 1252
- set /p BOM=<U.bom
- set /p=%BOM:~0,2%<nul >U.bom
-
- ::ansi → Unicode
- chcp 936
- copy U.bom Unicode.txt
- cmd /u /c "type ansi.txt >>Unicode.txt"
-
- ::=======================================
-
- chcp 65001
-
-
- ::Unicode → 無BOM的UTF-8
- type Unicode.txt > UTF-8-0.txt
-
-
- ::Unicode → 有BOM的UTF-8
- copy /b U.bom + Unicode.txt Unicode-2B.txt
- type Unicode-2B.txt > UTF-8-B.txt
-
- ::=======================================
- ::無BOM的UTF-8 → Unicode
- copy U.bom Unicode-save-0.txt
- cmd /u /c "type UTF-8-0.txt >> Unicode-save-0.txt"
-
-
- ::有BOM的UTF-8 → Unicode
- cmd /u /c "type UTF-8-B.txt > Unicode-save-1.txt"
-
- ::========================================
- ::Unicode → ansi
-
- chcp 936
-
- type Unicode-save-0.txt > ansi-save-0.txt
-
- type Unicode-save-1.txt > ansi-save-1.txt
复制代码
作者: muink 时间: 2018-6-18 20:07
取得 Unicode BOM 部分也可以这么写,但仅限win7及以上系统- echo.//4=>U.bom
- 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 的方案改进:- @ECHO off&setlocal EnableDelayedExpansion
- Set gbk=绿图
- chcp 1252 >nul
- for /f %%a in ('cmd/u/cecho !gbk!')do set un=%%a
- Set head=!un:~0,1!!un:~2,1!
- set/p=!head!<nul>U.bom
-
- chcp 936
- copy /b /y U.bom 转换后.txt
- cmd /u /c type 转换前.txt >>转换后.txt
- pause
复制代码
参考:http://www.bathome.net/redirect. ... 12347&pid=79254
1252 代码页真是个好东西,如果用 437,就得用 findstr 过滤才能生成干净的文件头:- @ECHO off&setlocal EnableDelayedExpansion
- Set gbk=绿图
- chcp 437>nul
- for /f %%a in ('cmd/u/cecho !gbk!')do set un=%%a
- Set head=!un:~0,1!!un:~2,1!
- set/p=@^
-
- !head!<nul>$
- chcp 936
- findstr /v @ $>c1.txt
- cmd /u /c type a.txt >>c1.txt
- pause
复制代码
----------------------------------------------------------------------------
那段时间,关于纯批真是出现了好多有趣的话题呢
后来大家发现纯批技巧只是在秀肌肉,无法从根本上解决问题,就开始各种杂交了...
好多压箱底的纯批技巧都已经忘了,这么多年都没找到合适的用途,再精巧的构思也没意义
也对,本质上,shell 就是各取其长么
作者: gao_leyun_km 时间: 2020-5-12 17:30
本帖最后由 gao_leyun_km 于 2020-5-12 17:44 编辑
纯批,转换将删除所有空行和所有行首鸣声符(一般不会存在),支持含有特殊字符的文件。
(也可以在第一个for循环中加上findstr命令改造成可以转换空行的脚本,但如果被转换文件行首有冒号就会被删除)
下面的BAT要保存为ANSI编码。- @echo off
- :Load
- if exist "%~1" goto Read
- cls&echo 未指定或指定的源文件不存在。请拖拽文件入内并按下回车键,或以文件完整路径为第一个参数(%%1)重新运行本批处理。
- set /p S=
- call :Load "%S:"=%"
- :Read
- set F="%~dp1%~n1_ANSI%~x1"
- if exist %F% del %F%
- set I=原始文件:"%~1"&set O=目标文件:%F%&set T0=# 注意:&set T1=# 转换过程中不会更改原始文件。&set T2=# 输出文件中将删除所有并在末尾创建一空白行。&set T3=# 每行开头的鸣声符(如果存在的话)将被删除。&set T4=# 不能识别的字符将输出问号。&set W=# 请稍等。
- >nul chcp 65001
- set Str=Str_%date:~3%_%time: =0%
- for /f "usebackq delims=" %%i in ("%~1") do >nul set %Str%=%%i&call :Convert
- start notepad.exe %F%
- ping 127.1 -n 1 >nul
- exit
- :Convert
- 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
- for /f "tokens=1* delims=" %%j in ('set %Str%') do >>%F% echo;%%k
- goto :eof
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |