網上找了很多辦法都沒有用。基本都是根據檔案的前兩個位元組判斷的。可是我要處理的這個檔案前兩位元組沒有表示格式。
http://bbs.csdn.net/topics/310101466 像這個帖子里的代碼,根本判斷不出來是utf8的。
用editplus打開一個文本檔案會看到下面狀態欄顯示它的編碼是utf-8,但是上面帖子判斷出來是ANSI,看下圖:

以16進制看了下,檔案前兩個位元組就是檔案內容本身,沒有專門標記編碼,看下圖:
http://img.my.csdn.net/uploads/201412/04/1417659625_4106.jpg
不知道editplus怎么判的。 記事本另存為它的時候也會自動選擇為utf-8,難道它們都是讀取的時候一個個分析里面的內容嗎? 要處理的檔案有很多。有些是utf8的有些是ANSI的。目的是挑出ANSI的修改里面的一部分內容。 具體是網頁的meta標簽里charset=utf-8 改成charset=euc-kr 不然打開會亂碼。
測驗檔案下載:http://files.cnblogs.com/sysdzw/%E6%B5%8B%E8%AF%95%E6%96%87%E4%BB%B6.rar
uj5u.com熱心網友回復:
既然有charset=euc-kr那就不應該是UTF-8編碼的uj5u.com熱心網友回復:
樓主的意思可能是:charset設定成了A編碼,保存的時候檔案采用了B編碼大自然的搬運工:
http://bbs.csdn.net/topics/370095245
uj5u.com熱心網友回復:
檔案ANSI + charset=utf-8 ———— html檔案打開亂碼
檔案ANSI + charset=euc-kr ———— html檔案打開正常
現在就是一個檔案夾里有一大批html檔案,有ANSI 的也有utf8的,沒法區分出目標檔案進行上述調整。
樓上發的那個根據檔案內容的貌似也行不通。那樓主最后也沒有完整的方案。 實在不行我研究怎么呼叫editplus來得到底部那個編碼了。
uj5u.com熱心網友回復:
我拿UltraEdit打開了你的測驗檔案,結果辨認失敗,全認成了utf8……遍歷是少不了的了,只能通過里面的編碼來辨認,稍微有點小痛苦。
你的檔案按字符范圍來看只有兩種情況:
第一種,整個檔案全是字母、數字、符號,那就沒什么好糾結的了,ANSI和 UTF8的結果一樣,直接把它讀出來,存成UTF-8就行;
第二種,如果包含非ASCII范圍的內容,那就整個檔案讀出來逐位元組分析:如果發現有11xxxxxx 開頭(大于C0)的位元組,就先取一下開頭1的長度,這就獲取到了該字符的長度,取完再往后讀相應長度的內容,是不是全以10開頭(大于80)的,如果是,那就是UTF-8,如果不是就簡單粗暴地歸成ANSI吧。
uj5u.com熱心網友回復:
不過,說起來這么一大篇,但是規則都已經很明確了,寫出來也不復雜,執行起來也不會很費時間。為了提高識別的準確率,還是整個檔案全檢查下來吧uj5u.com熱心網友回復:
感覺樓主的思路可能是走了某種誤區。這樣吧,你試下國產的這個可說是比editplus還強些的軟體如果能自動識別你的檔案,那就加下他的軟體群進去,親自問下作者是根據什么次序判斷的,據我在該軟體群的了解,這種不算啥技識訓密的東西,他應該是愿意分享的:
http://www.everedit.net/
uj5u.com熱心網友回復:
你說的這個,也是我們比較容易想到的一種方法。當然,在實際產品中,要考慮到各方面的容錯性,但你說的這一步全文掃描判斷,我覺得是必要的一步。
uj5u.com熱心網友回復:
發一個判斷網頁編碼格式的,看看能不能幫到樓主
Private Function IsUTF8(Bytes) As Boolean
'網頁編碼判斷
On Error GoTo Err
Dim i As Long, AscN As Long, Length As Long
Length = UBound(Bytes) + 1
If Length < 3 Then
IsUTF8 = False
Exit Function
ElseIf Bytes(0) = &HEF And Bytes(1) = &HBB And Bytes(2) = &HBF Then
IsUTF8 = True
Exit Function
End If
Do While i <= Length - 1
If Bytes(i) < 128 Then
i = i + 1
AscN = AscN + 1
ElseIf (Bytes(i) And &HE0) = &HC0 And (Bytes(i + 1) And &HC0) = &H80 Then
i = i + 2
ElseIf i + 2 < Length Then
If (Bytes(i) And &HF0) = &HE0 And (Bytes(i + 1) And &HC0) = &H80 And (Bytes(i + 2) And &HC0) = &H80 Then
i = i + 3
Else
IsUTF8 = False
Exit Function
End If
Else
IsUTF8 = False
Exit Function
End If
Loop
If AscN = Length Then
IsUTF8 = False
Else
IsUTF8 = True
End If
Exit Function
Err:
EM "IsUTF8"
End Function
uj5u.com熱心網友回復:
就樓主提供的2個例子,utf8==>True;ansi==>False
我看行!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/106527.html
標籤:VB基礎類
