在了解如何用vba判断一个文本文件是以什么编码形式保存之前,我们先来了解下字节序的概念。
比如一个中文字符“保”的unicode编码为4FDD,在存入到计算机时,需要用2个字节,如果第一个字节存4F,第二个字节存DD,那么它的字节序就是Big Endian。如果第一个字节存DD,第二个字节存4F,那么它的字节序就是 Little Endian。
由于一个文本文件可以保存为ANSI编码、Unicode Little Endian 编码、Unicode Big Endian 编码、UTF-8编码,为了便于识别具体是用哪种编码哪种字节序存储的文本文件,Windows 引入了BOM(Byte Order Mark,字节序标记)来表征文本文件的编码方式。
在unicode编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在unicode编码中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。
Sub QQ1722187970() Dim sPath As String sPath = "c:\test.txt" iFN = VBA.FreeFile Open sPath For Binary Access Read As iFN Dim iLenB '获取打开文本文件的字节数 iLenB = VBA.LOF(iFN) If iLenB > 0 Then Dim sResult() As Byte ReDim sResult(iLenB - 1) Get iFN, , sResult Select Case UBound(sResult) Case 0 MsgBox "ANSI编码" Case 1 sBom = VBA.Hex(sResult(0)) & VBA.Hex(sResult(1)) If sBom = "FEFF" Then MsgBox "Unicode Big Endian 编码" ElseIf sBom = "FFFE" Then MsgBox "Unicode Little Endian 编码" Else MsgBox "ANSI编码" End If Case Is > 1 sBom = VBA.Hex(sResult(0)) & VBA.Hex(sResult(1)) & VBA.Hex(sResult(2)) If Left(sBom, 4) = "FEFF" Then MsgBox "Unicode Big Endian 编码" ElseIf Left(sBom, 4) = "FFFE" Then MsgBox "Unicode Little Endian 编码" ElseIf Left(sBom, 6) = "EFBBBF" Then MsgBox "UTF-8编码" Else MsgBox "ANSI编码" End If End Select End If '关闭打开的文件 Close iFN End Sub
发表评论