Board logo

标题: [文件操作] [已解决]批处理如何判断文件编码类型并分类? [打印本页]

作者: xp3000    时间: 2016-3-27 05:06     标题: [已解决]批处理如何判断文件编码类型并分类?

本帖最后由 xp3000 于 2016-3-27 15:48 编辑

文件夹内的文件类型有TXT、HTML、HTM,运行后建立下面编码类型文件夹
ANSI
UTF-8
UTF-8无BOM
Unicode

判断文件编码类型后移动到各自类型的文件夹
作者: CrLf    时间: 2016-3-27 08:42

回复 1# xp3000


    http://www.bathome.net/s/tool/index.html?key=编码
enca 也许就是你想要的
作者: xp3000    时间: 2016-3-27 09:34

估计会流产,找不到相关介绍,
也就是检查到文件编码是ANSI移动到ANSI文件夹,检查到编码是UTF-8移动到UTF-8文件夹
作者: WHY    时间: 2016-3-27 12:42

以前的代码,翻出来小改一下,凑合着能用
  1. Dim fso, objFile, strExt, strFolder
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. For Each objFile in fso.GetFolder(".").Files
  4.     strExt = fso.GetExtensionName(objFile.Path)
  5.     strExt = LCase(strExt)
  6.     If strExt = "txt" Or strExt = "html" Or strExt = "htm" Then
  7.         strFolder = GetEncodingType(objFile.Path)
  8.         If Not fso.FolderExists(strFolder) Then
  9.             fso.CreateFolder(strFolder)
  10.         End If
  11.         objFile.Move strFolder & "\"
  12.     End If
  13. Next
  14. MsgBox "Success!"
  15. Function GetEncodingType(file)
  16.     Dim ado, bom, i, arr(), n
  17.     Set ado = CreateObject("ADODB.Stream")
  18.     ado.Mode = 3
  19.     ado.Type = 1
  20.     ado.Open
  21.     ado.LoadFromFile file
  22.     For i = 1 To 3
  23.         bom = bom & Hex(AscB(ado.Read(1)))
  24.     Next
  25.     If InStr(bom, "FFFE") Or InStr(bom, "FEFF") Then
  26.         GetEncodingType = "UNICODE"
  27.     ElseIf bom = "EFBBBF" Then
  28.         GetEncodingType = "UTF8"
  29.     Else
  30.         ado.Position = 0
  31.         n = ado.Size - 1
  32.         ReDim arr(n)
  33.         For i = 0 to n
  34.             arr(i) = ChrW(AscB(ado.Read(1)))
  35.         Next
  36.         If IsUtf8(Join(arr, "")) Then
  37.             GetEncodingType = "UTF8NOBOM"
  38.         Else
  39.             GetEncodingType = "ANSI"
  40.         End If
  41.     End If
  42.     ado.Close
  43.     Set ado = Nothing
  44. End Function
  45. Function IsUtf8(ByRef str)
  46.     Dim s, reg
  47.     s = "[\xC0-\xDF]([^\x80-\xBF]|$)"
  48.     s = s & "|[\xE0-\xEF].{0,1}([^\x80-\xBF]|$)"
  49.     s = s & "|[\xF0-\xF7].{0,2}([^\x80-\xBF]|$)"
  50.     s = s & "|[\xF8-\xFB].{0,3}([^\x80-\xBF]|$)"
  51.     s = s & "|[\xFC-\xFD].{0,4}([^\x80-\xBF]|$)"
  52.     s = s & "|[\xFE-\xFE].{0,5}([^\x80-\xBF]|$)"
  53.     s = s & "|[\x00-\x7F][\x80-\xBF]"
  54.     s = s & "|[\xC0-\xDF].[\x80-\xBF]"
  55.     s = s & "|[\xE0-\xEF]..[\x80-\xBF]"
  56.     s = s & "|[\xF0-\xF7]...[\x80-\xBF]"
  57.     s = s & "|[\xF8-\xFB]....[\x80-\xBF]"
  58.     s = s & "|[\xFC-\xFD].....[\x80-\xBF]"
  59.     s = s & "|[\xFE-\xFE]......[\x80-\xBF]"
  60.     s = s & "|^[\x80-\xBF]"
  61.     Set reg = New RegExp
  62.     reg.Pattern = s
  63.     IsUtf8 = Not reg.Test(str)
  64.     Set reg = Nothing
  65. End Function
复制代码

作者: happy886rr    时间: 2016-3-27 13:25

本帖最后由 happy886rr 于 2016-3-27 13:36 编辑

回复 1# xp3000
请先下载ENCA.EXE网址:http://batch-cn.qiniudn.com/tool/1.18/enca.rar
将ENCA.EXE和两个dll与批处理一起放入要查看的文件夹内
  1. @echo off&setlocal enabledelayedexpansion
  2. md ANSI文件夹  2>NUL
  3. md UTF-8文件夹 2>NUL
  4. md Unicode文件夹 2>NUL
  5. for /f "delims=" %%a in ('dir /a-d /b /s *.txt *.htm *.html') do (
  6. set gk=0
  7. enca -L zh_CN "%%a"|find /i "UCS-2" && set gk=1
  8. enca -L zh_CN "%%a"|find /i "UTF-8" && set gk=2
  9. if !gk! equ 1 (set "cho=Unicode文件夹")
  10. if !gk! equ 2 (set "cho=UTF-8文件夹")
  11. if !gk! equ 0 (set "cho=ANSI文件夹")
  12. if exist "!cho!\%%~na.txt" (
  13. set k=1
  14. for /l %%i in (1 1 255) do (
  15. if !k! equ 1 (
  16. if not exist "!cho!\%%~na-%%i%%~xa" (
  17. set "SN=%%i"
  18. set k=0
  19. )
  20. )
  21. )
  22. move "%%a" "!cho!\%%~na-!SN!%%~xa"
  23. ) else (
  24. move "%%a" "!cho!\%%~nxa"
  25. )
  26. )
复制代码

作者: ygqiang    时间: 2016-3-27 14:01

回复 5# happy886rr

最后加上,会更完美。。
  1.     dir ANSI文件夹 /b | findstr /r ".*" || rd ANSI文件夹
  2. dir UTF-8文件夹 /b | findstr /r ".*" || rd UTF-8文件夹
  3. dir Unicode文件夹 /b | findstr /r ".*" || rd Unicode文件夹
复制代码

作者: happy886rr    时间: 2016-3-27 14:08

回复 6# ygqiang
enca的编码识别率还是挺高的,我只有在输入大量重复单字时才能把它搞失效。
作者: xp3000    时间: 2016-3-27 14:24

回复 5# happy886rr


    这个没把UTF-8无ROM文件头的识别出来
作者: xp3000    时间: 2016-3-27 14:36

感谢两位的支持,如果能加入其他编码识别更好
作者: happy886rr    时间: 2016-3-27 14:46

回复 9# xp3000
这个是enca的问题,enca是别人写的,需要他的作者去添加各种编码的支持。批处理只是调用enca。
作者: CrLf    时间: 2016-3-27 17:11

或者暴力一点,find /i "charset=utf-8",只要不是心理变态的网页应该都 ok
作者: wskwfkbdn    时间: 2016-3-28 14:06

识别文本编码,我命令行可以100%的识别出来,ansi,utf8无bom,unicode,都可以准确识别出,过两天空了我就发出来。
作者: CrLf    时间: 2016-3-29 01:28

检查 a.html 的 BOM,如果无 BOM,则试试能不能转为 gb2312,不能转就当成是 utf-8:
  1. mshta http://bathome.net/s/hta/ t=iconv.load('a.html');b=iconv.checkBom(t);if(b=='undefined')b=iconv.toStr(t,'gb2312')?'gb2312':'utf-8';b | more
复制代码
这个是先试着转为 utf-8,如果不能转就视为 gb2312:
  1. mshta http://bathome.net/s/hta/ t=iconv.load('a.html');b=iconv.checkBom(t);if(b=='undefined')b=iconv.toStr(t,'utf-8')?'utf-8':'gb2312';b | more
复制代码

作者: CrLf    时间: 2016-3-29 01:39

百分百准确检测无 BOM 头的文本编码是不可能哒,因为各种无 BOM 头的编码之间常有重叠
运行以下代码返回的都是 a.html 可能的文件编码:
  1. mshta http://bathome.net/s/hta/?string "t=iconv.load('a.html');list.charset().where(function(c){return iconv.toStr(t,c)})"|more
复制代码
不过你的 html 一般可以检测头部的 META CharSet 来获得实际的编码名




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