标题: [文本处理] 批处理如何区分txt文件是utf8还是ansi编码? [打印本页]
作者: gpshuren 时间: 2023-8-21 22:36 标题: 批处理如何区分txt文件是utf8还是ansi编码?
文件夹下有很多txt,有的是utf8编码格式有的是ansi编码格式,
1把utf8格式的合并到一个新的utf8格式的txt中 ansi合并到另一个新的ansi格式的txt中
2把ansi格式的txt的内容转成utf8格式再保存到一个新的utf8格式的txt中
求以上两种方式用批处理如何实现
作者: gpshuren 时间: 2023-8-21 22:38
第2个方式转换的时候中文不能有乱码
作者: gpshuren 时间: 2023-8-21 23:58
能用bat实现么?或者给具体代码,新手哈不会powershell
作者: gpshuren 时间: 2023-8-22 00:09
谁给个bat示例 读取前4个字节根据字节的内容判断是否是utf还是ansi。
作者: 77七 时间: 2023-8-22 00:41
本帖最后由 77七 于 2023-8-22 00:44 编辑
http://bcn.bathome.net/tool/coder.exe- @echo off
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- coder -s -a gc -f "%%i"|find "ANSI" 1>nul && (
- >>new_ansi.txt type "%%i"
- )
- coder -s -a gc -f "%%i"|find "UTF-8" 1>nul && (
- >>new_utf-8.txt type "%%i"
- )
- )
- coder -c ansi utf-8 -f "new_ansi.txt" >"new_utf-8_2.txt"
- pause
复制代码
作者: Five66 时间: 2023-8-22 01:34
本帖最后由 Five66 于 2023-8-22 02:27 编辑
不嫌速度慢,可以试试下面的,看输出是否是空 来判断是否utf8 with bom- certutil "aaa.txt" |findstr /b /rc:" 00* ef bb bf"
复制代码
作者: hfxiang 时间: 2023-8-22 10:10
回复 1# gpshuren
went大侠的coder.exe( http://www.bathome.net/redirect. ... 4759&ptid=57518 )能够识别编码,之后的事就好开展了
作者: gpshuren 时间: 2023-8-22 21:43
有没有bat能实现的,不想借助第三方exe实现。被提示有病毒
作者: jyswjjgdwtdtj 时间: 2023-8-22 22:28
回复 8# gpshuren
或许可以用chcp和type 看看是不是乱码
不过肯定不靠谱 我也不懂bat
作者: gpshuren 时间: 2023-8-22 22:52
certutil "aaa.txt" |findstr /b /rc:" 00* ef bb bf" 这个在cmd里可以实现没问题,但在bat里面执行就直接秒退了
作者: Five66 时间: 2023-8-23 00:08
那只是示例,bat运行后显示完就直接退出了,实际需要的代码得自己写
例如检测当前目录(不包括子目录)所有txt是否是utf8bom的bat- @echo off&setlocal enabledelayedexpansion
- echo.
- for %%i in (*.txt) do (
- certutil "%%~i" |findstr /b /m /rc:" 00* ef bb bf" 1>nul
- if !errorlevel! equ 0 (echo "%%~ni 是utf8bom") else echo "%%~ni 不是utf8bom"
- )
- echo.&pause
复制代码
作者: wanghan519 时间: 2023-8-23 03:53
本帖最后由 wanghan519 于 2023-8-23 03:54 编辑
回复 10# gpshuren
主要不是所有utf8文件都有bom
liunx shell环境有file,也有win里单文件的file.exe,各种语言也都有chardet库,powershell有EncodingAnalyzer模块,还有最新的玩具nushell也得装charset插件,找了一圈都得用外部的工具才行。。。
作者: Nsqs 时间: 2023-8-23 10:02
本帖最后由 Nsqs 于 2023-8-23 10:08 编辑
- @echo off
- set "param=-noprofile -executionpolicy bypass"
- call:CodeName dir /b *.txt
- call:Merge-txtfile
- call:To-Utf8
- type uft8-txt\tmp.txt
- del uft8-txt\tmp.txt
- pause
- goto :eof
-
- :CodeName
- powershell %param% "md uft8-txt -force|out-null"
- %*|powershell -noprofile -executionpolicy bypass "process{try{$CodeName=$Input|%%{if(Test-Path $input -PathType Leaf){[byte[]]$byte=gc -Encoding byte -ReadCount 4 -TotalCount 4 -Path $input;if( $byte[0] -eq 0xef -and $byte[1] -eq 0xbb -and $byte[2] -eq 0xbf ){'UTF8'}elseif($byte[0] -eq 0xfe -and $byte[1] -eq 0xff){'Unicode'}elseif($byte[0] -eq 0 -and $byte[1] -eq 0 -and $byte[2] -eq 0xfe -and $byte[3] -eq 0xff){'UTF32'}elseif($byte[0] -eq 0x2b -and $byte[1] -eq 0x2f -and $byte[2] -eq 0x76){'UTF7'}else{'ASCII'}}};if($CodeName -ne $null){('{0}={1}' -f $_,$CodeName)>>uft8-txt\tmp.txt}}catch{}}"
- goto :eof
-
-
- :Merge-txtfile
- powershell %param% "gc uft8-txt\tmp.txt|%%{$s=$_ -split '=';gc $s[0]|ac "uft8-txt\New_$($s[1]).txt" -Encoding $s[1]}"
- goto :eof
-
- :To-Utf8
- powershell %param% "gc uft8-txt\tmp.txt|%%{$s=$_ -split '=';gc $s[0]|out-file "uft8-txt\New_$($s[1])_$($s[0])" -Encoding utf8}"
- goto :eof
复制代码
运行之前测试或备份,我这边测试没有问题,运行之后会生成一个新的文件夹
作者: buyiyang 时间: 2023-8-23 13:26
回复 13# Nsqs
判断漏了UTF16LE、UTF32LE、无BOM的UTF8,都会被识别为ASCII
作者: gpshuren 时间: 2023-8-26 08:19
回复 13# Nsqs
的确会误判,把utf8判断为ANSI,
作者: 77七 时间: 2023-8-26 09:49
其实你想为什么会出来一个第三方工具,纯bat应该很难实现了。
不嫌麻烦,以下两个帖子应该也能实现。
批处理如何判断文件编码类型并分类?PowerShell把txt文件的编码转为UTF8乱码问题, 请高手支招
如果需要合并,自行搜索下。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |