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

[文件操作] [已解决]批处理如何判断文件编码类型并分类?

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

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

判断文件编码类型后移动到各自类型的文件夹

回复 1# xp3000


    http://www.bathome.net/s/tool/index.html?key=编码
enca 也许就是你想要的
1

评分人数

TOP

估计会流产,找不到相关介绍,
也就是检查到文件编码是ANSI移动到ANSI文件夹,检查到编码是UTF-8移动到UTF-8文件夹

TOP

以前的代码,翻出来小改一下,凑合着能用
  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
复制代码
1

评分人数

    • xp3000: 这个VBS能用技术 + 1

TOP

本帖最后由 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. )
复制代码
1

评分人数

    • xp3000: 能用,如果完美更好技术 + 1

TOP

回复 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文件夹
复制代码
1

评分人数

    • CrLf: 乐于助人技术 + 1

TOP

回复 6# ygqiang
enca的编码识别率还是挺高的,我只有在输入大量重复单字时才能把它搞失效。

TOP

回复 5# happy886rr


    这个没把UTF-8无ROM文件头的识别出来

TOP

感谢两位的支持,如果能加入其他编码识别更好

TOP

回复 9# xp3000
这个是enca的问题,enca是别人写的,需要他的作者去添加各种编码的支持。批处理只是调用enca。

TOP

或者暴力一点,find /i "charset=utf-8",只要不是心理变态的网页应该都 ok

TOP

识别文本编码,我命令行可以100%的识别出来,ansi,utf8无bom,unicode,都可以准确识别出,过两天空了我就发出来。

TOP

检查 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
复制代码
1

评分人数

TOP

百分百准确检测无 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 来获得实际的编码名
1

评分人数

TOP

返回列表