[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理如何区分txt文件是utf8还是ansi编码?

文件夹下有很多txt,有的是utf8编码格式有的是ansi编码格式,
1把utf8格式的合并到一个新的utf8格式的txt中  ansi合并到另一个新的ansi格式的txt中  
2把ansi格式的txt的内容转成utf8格式再保存到一个新的utf8格式的txt中
求以上两种方式用批处理如何实现

其实你想为什么会出来一个第三方工具,纯bat应该很难实现了。
不嫌麻烦,以下两个帖子应该也能实现。
批处理如何判断文件编码类型并分类?PowerShell把txt文件的编码转为UTF8乱码问题, 请高手支招
如果需要合并,自行搜索下。
bat小白,请多指教!谢谢!

TOP

回复 13# Nsqs

的确会误判,把utf8判断为ANSI,

TOP

回复 13# Nsqs


    判断漏了UTF16LE、UTF32LE、无BOM的UTF8,都会被识别为ASCII

TOP

本帖最后由 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
复制代码
运行之前测试或备份,我这边测试没有问题,运行之后会生成一个新的文件夹
1

评分人数

TOP

本帖最后由 wanghan519 于 2023-8-23 03:54 编辑

回复 10# gpshuren


    主要不是所有utf8文件都有bom
liunx shell环境有file,也有win里单文件的file.exe,各种语言也都有chardet库,powershell有EncodingAnalyzer模块,还有最新的玩具nushell也得装charset插件,找了一圈都得用外部的工具才行。。。

TOP

那只是示例,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
复制代码

TOP

certutil "aaa.txt" |findstr /b /rc:"    00*  ef bb bf"  这个在cmd里可以实现没问题,但在bat里面执行就直接秒退了

TOP

回复 8# gpshuren


    或许可以用chcp和type 看看是不是乱码
不过肯定不靠谱 我也不懂bat

TOP

有没有bat能实现的,不想借助第三方exe实现。被提示有病毒

TOP

回复 1# gpshuren

went大侠的coder.exe( http://www.bathome.net/redirect. ... 4759&ptid=57518 )能够识别编码,之后的事就好开展了

TOP

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

不嫌速度慢,可以试试下面的,看输出是否是空  来判断是否utf8 with bom
  1. certutil "aaa.txt" |findstr /b /rc:"    00*  ef bb bf"
复制代码

TOP

本帖最后由 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
复制代码
bat小白,请多指教!谢谢!

TOP

谁给个bat示例 读取前4个字节根据字节的内容判断是否是utf还是ansi。

TOP

能用bat实现么?或者给具体代码,新手哈不会powershell

TOP

返回列表