标题: [文件操作] [已解决]批处理如何判断文件编码类型并分类? [打印本页]
作者: 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
以前的代码,翻出来小改一下,凑合着能用- Dim fso, objFile, strExt, strFolder
-
- Set fso = CreateObject("Scripting.FileSystemObject")
- For Each objFile in fso.GetFolder(".").Files
- strExt = fso.GetExtensionName(objFile.Path)
- strExt = LCase(strExt)
- If strExt = "txt" Or strExt = "html" Or strExt = "htm" Then
- strFolder = GetEncodingType(objFile.Path)
- If Not fso.FolderExists(strFolder) Then
- fso.CreateFolder(strFolder)
- End If
- objFile.Move strFolder & "\"
- End If
- Next
-
- MsgBox "Success!"
-
- Function GetEncodingType(file)
- Dim ado, bom, i, arr(), n
- Set ado = CreateObject("ADODB.Stream")
- ado.Mode = 3
- ado.Type = 1
- ado.Open
- ado.LoadFromFile file
- For i = 1 To 3
- bom = bom & Hex(AscB(ado.Read(1)))
- Next
- If InStr(bom, "FFFE") Or InStr(bom, "FEFF") Then
- GetEncodingType = "UNICODE"
- ElseIf bom = "EFBBBF" Then
- GetEncodingType = "UTF8"
- Else
- ado.Position = 0
- n = ado.Size - 1
- ReDim arr(n)
- For i = 0 to n
- arr(i) = ChrW(AscB(ado.Read(1)))
- Next
- If IsUtf8(Join(arr, "")) Then
- GetEncodingType = "UTF8NOBOM"
- Else
- GetEncodingType = "ANSI"
- End If
- End If
- ado.Close
- Set ado = Nothing
- End Function
-
- Function IsUtf8(ByRef str)
- Dim s, reg
- s = "[\xC0-\xDF]([^\x80-\xBF]|$)"
- s = s & "|[\xE0-\xEF].{0,1}([^\x80-\xBF]|$)"
- s = s & "|[\xF0-\xF7].{0,2}([^\x80-\xBF]|$)"
- s = s & "|[\xF8-\xFB].{0,3}([^\x80-\xBF]|$)"
- s = s & "|[\xFC-\xFD].{0,4}([^\x80-\xBF]|$)"
- s = s & "|[\xFE-\xFE].{0,5}([^\x80-\xBF]|$)"
- s = s & "|[\x00-\x7F][\x80-\xBF]"
- s = s & "|[\xC0-\xDF].[\x80-\xBF]"
- s = s & "|[\xE0-\xEF]..[\x80-\xBF]"
- s = s & "|[\xF0-\xF7]...[\x80-\xBF]"
- s = s & "|[\xF8-\xFB]....[\x80-\xBF]"
- s = s & "|[\xFC-\xFD].....[\x80-\xBF]"
- s = s & "|[\xFE-\xFE]......[\x80-\xBF]"
- s = s & "|^[\x80-\xBF]"
- Set reg = New RegExp
- reg.Pattern = s
- IsUtf8 = Not reg.Test(str)
- Set reg = Nothing
- 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与批处理一起放入要查看的文件夹内- @echo off&setlocal enabledelayedexpansion
- md ANSI文件夹 2>NUL
- md UTF-8文件夹 2>NUL
- md Unicode文件夹 2>NUL
- for /f "delims=" %%a in ('dir /a-d /b /s *.txt *.htm *.html') do (
- set gk=0
- enca -L zh_CN "%%a"|find /i "UCS-2" && set gk=1
- enca -L zh_CN "%%a"|find /i "UTF-8" && set gk=2
- if !gk! equ 1 (set "cho=Unicode文件夹")
- if !gk! equ 2 (set "cho=UTF-8文件夹")
- if !gk! equ 0 (set "cho=ANSI文件夹")
- if exist "!cho!\%%~na.txt" (
- set k=1
- for /l %%i in (1 1 255) do (
- if !k! equ 1 (
- if not exist "!cho!\%%~na-%%i%%~xa" (
- set "SN=%%i"
- set k=0
- )
- )
- )
- move "%%a" "!cho!\%%~na-!SN!%%~xa"
- ) else (
- move "%%a" "!cho!\%%~nxa"
- )
- )
复制代码
作者: ygqiang 时间: 2016-3-27 14:01
回复 5# happy886rr
最后加上,会更完美。。- dir ANSI文件夹 /b | findstr /r ".*" || rd ANSI文件夹
- dir UTF-8文件夹 /b | findstr /r ".*" || rd UTF-8文件夹
- 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:- 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:- 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 可能的文件编码:- 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 |