用VBS判断无BOM头的文件是否UTF-8编码
2014-11-15 22:39
721 查看
标签:
UTF-8,
VBS,
标题:用VBS判断无BOM头的文件是否UTF-8编码
作者:Demon
链接:
版权:本博客的所有文章,都遵守“
在VBS贴吧看到吧主发的一个《
字节顺序记号(英语:byte-ordermark,BOM)是位于码点U+FEFF的统一码字符的名称。当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号。
更多关于BOM的资料请自己阅读
批处理之家有个《
FunctionCheckCode(Usage) Dimslz setslz=CreateObject("Adodb.Stream") slz.Type=1 slz.Mode=3 slz.Open slz.Position=0 slz.Loadfromfilefile Bin=slz.read(2) ifAscB(MidB(Bin,1,1))=&HEFandAscB(MidB(Bin,2,1))=&HBBThen Codes="UTF-8" elseifAscB(MidB(Bin,1,1))=&HFFandAscB(MidB(Bin,2,1))=&HFEThen Codes="Unicode" else Codes="GB2312" endif WScript.echofile,Usage,Codes slz.Close setslz=Nothing EndFunction
这个代码只检测了BOM,把没有BOM的文件都认为是GB2312编码,很显然是错误的。并不是所有UTF-8编码的文件都带BOM标记的,事实上,绝大部分UTF-8文件都不带BOM。
理论上,要准确地判断一个文件的编码是很困难的,但是判断一个文件是否为UTF-8编码却相对比较简单,在《
<?php functionis_valid_utf8(&$input){ $rx='[\xC0-\xDF]([^\x80-\xBF]|$)'; $rx.='|[\xE0-\xEF].{0,1}([^\x80-\xBF]|$)'; $rx.='|[\xF0-\xF7].{0,2}([^\x80-\xBF]|$)'; $rx.='|[\xF8-\xFB].{0,3}([^\x80-\xBF]|$)'; $rx.='|[\xFC-\xFD].{0,4}([^\x80-\xBF]|$)'; $rx.='|[\xFE-\xFE].{0,5}([^\x80-\xBF]|$)'; $rx.='|[\x00-\x7F][\x80-\xBF]'; $rx.='|[\xC0-\xDF].[\x80-\xBF]'; $rx.='|[\xE0-\xEF]..[\x80-\xBF]'; $rx.='|[\xF0-\xF7]...[\x80-\xBF]'; $rx.='|[\xF8-\xFB]....[\x80-\xBF]'; $rx.='|[\xFC-\xFD].....[\x80-\xBF]'; $rx.='|[\xFE-\xFE]......[\x80-\xBF]'; $rx.='|^[\x80-\xBF]'; returnpreg_match("!$rx!",$input)?0:1; } ?>
我们要做的就是改写成VBS:
Functionread(path) '将Byte()数组转成String字符串 Dimado,a(),i,n Setado=CreateObject("ADODB.Stream") ado.Type=1:ado.Open ado.LoadFromFilepath n=ado.Size-1 ReDima(n) Fori=0Ton a(i)=ChrW(AscB(ado.Read(1))) Next read=Join(a,"") EndFunction 'Author:Demon 'Date:2011/11/10 'Website:http://demon.tw Functionis_valid_utf8(ByRefinput)'ByRef以提高效率 Dims,re Setre=NewRegexp 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]" re.Pattern=s is_valid_utf8=(Notre.Test(input)) EndFunction s=read("utf-8.txt")'读取文件 WScript.Echois_valid_utf8(s)'判断是否UTF-8
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
yu2n说道: 2014年08月16日14:08[code]
'检察文件是否为UTF-8,有BOM/无BOM皆可,读取文件BOM头/前4Kbit判读
Functionis_valid_utf8(ByValfile)
is_valid_utf8=False
'将Byte()数组转成String字符串
Dimado,a(),i,n,Bin,s,re
Setado=CreateObject("ADODB.Stream")
ado.Type=1:ado.Open
ado.LoadFromFilefile
n=ado.Size-1
'检查空文件/限制读取4Kbit
Ifn=1024*4-1Thenn=1024*4-1'4Kbit
'使用BOM判断
Bin=ado.read(2)
IfAscB(MidB(Bin,1,1))=&HEFAndAscB(MidB(Bin,2,1))=&HBBThen
is_valid_utf8=True:ExitFunction
EndIf
'将Byte()数组转成String字符串
ReDima(n):ado.Position=0
Fori=0Ton
a(i)=ChrW(AscB(ado.Read(1)))
Next
'使用正则表达式判断
Setre=NewRegexp
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]"
re.Pattern=s
is_valid_utf8=(Notre.Test(Join(a,"")))
EndFunction
[/code]
相关文章推荐
- 无BOM的条件下C语言判断一个文件是否为UTF-8编码代码(windows,linux通用)
- 在QT中,当BOM头不存在的时候,判断一个文件是否为UTF-8编码格式
- 判断文件编码是否为UTF-8收藏
- 判断文件是否是UTF-8编码
- 用PHP判断文件是否是UTF-8编码
- 判断文件编码是否为UTF-8收藏
- 判断文件编码是否为UTF
- UTF-8格式编码的文件分为带BOM和不带BOM
- 如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)
- 判断一段文件是UTF-8编码还是GB2312的编码方式
- UTF-8 BOM编码格式文件对SSI的影响
- vbs学习笔记1——判断文件和文件夹是否存在
- PHP判断编码是否为utf-8 函数
- php文件代码采用UTF-8编码的BOM问题
- 判断一段文件是UTF-8编码还是GB2312的编码方式
- UTF-8文件编码格式中有无签名问题汇总(BOM)
- VC++ 判断文本文件是否UTF-8编码
- 判断文件是否是utf-8
- php文件代码采用UTF-8编码的BOM问题---转自CSDN---十方地藏---http://blog.csdn.net/webdesman
- excel打开UTF-8编码的CSV文件,添加BOM头后不再乱码