Board logo

标题: [文本处理] 批处理如何区分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
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  3. coder -s -a gc -f "%%i"|find "ANSI" 1>nul && (
  4. >>new_ansi.txt type "%%i"
  5. )
  6. coder -s -a gc -f "%%i"|find "UTF-8" 1>nul && (
  7. >>new_utf-8.txt type "%%i"
  8. )
  9. )
  10. coder -c ansi utf-8 -f "new_ansi.txt" >"new_utf-8_2.txt"
  11. pause
复制代码

作者: Five66    时间: 2023-8-22 01:34

本帖最后由 Five66 于 2023-8-22 02:27 编辑

不嫌速度慢,可以试试下面的,看输出是否是空  来判断是否utf8 with bom
  1. 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
  1. @echo off&setlocal enabledelayedexpansion
  2. echo.
  3. for %%i in (*.txt) do (
  4. certutil "%%~i" |findstr /b /m /rc:"    00*  ef bb bf" 1>nul
  5. if !errorlevel! equ 0 (echo "%%~ni    是utf8bom") else echo "%%~ni    不是utf8bom"
  6. )
  7. 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 编辑
  1. @echo off
  2. set "param=-noprofile -executionpolicy bypass"
  3. call:CodeName dir /b *.txt
  4. call:Merge-txtfile
  5. call:To-Utf8
  6. type uft8-txt\tmp.txt
  7. del uft8-txt\tmp.txt
  8. pause
  9. goto :eof
  10. :CodeName
  11. powershell %param% "md uft8-txt -force|out-null"
  12. %*|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{}}"
  13. goto :eof
  14. :Merge-txtfile
  15. powershell %param% "gc uft8-txt\tmp.txt|%%{$s=$_ -split '=';gc $s[0]|ac "uft8-txt\New_$($s[1]).txt" -Encoding $s[1]}"
  16. goto :eof
  17. :To-Utf8
  18. powershell %param% "gc uft8-txt\tmp.txt|%%{$s=$_ -split '=';gc $s[0]|out-file "uft8-txt\New_$($s[1])_$($s[0])" -Encoding utf8}"
  19. 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