在了解如何用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


发表评论