無BOM utf8編碼判斷
BOM(Byte Order Mark)是一個字元,它表明UNICODE文字的UTF-16,UTF-32的編碼位元組順序(高位元組低位元組順序)和編碼方式(UTF-8,UTF-16,UTF-32, 其中UTF-8編碼是位元組順序無關的)。
如下所示:
Encoding Representation
UTF-8 EF BB BF
UTF-16 Big Endian FE FF
UTF-16 Little Endian FF FE
UTF-32 Big Endian 00 00 FE FF
UTF-32 Little Endian FF FE 00 00
有些utf8編碼沒有這個BOM,該怎麼區分了,是utf8還是ansi(根本就沒有BOM這個東西),下面先了解下utf8:
UTF-8是UNICODE的一種變長字元編碼,由Ken Thompson於1992年建立。現在已經標準化為RFC 3629。UTF-8用1到6個位元組編碼UNICODE字元。如果UNICODE字元由2個位元組表示,則編碼成UTF-8很可能需要3個位元組,而如果UNICODE字元由4個位元組表示,則編碼成UTF-8可能需要6個位元組。用4個或6個位元組去編碼一個UNICODE字元可能太多了,但很少會遇到那樣的UNICODE字元。
UFT-8轉換表表示如下:
UNICODE UTF-8
00000000 - 0000007F 0xxxxxxx
00000080 - 000007FF 110xxxxx 10xxxxxx
00000800 - 0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
00010000 - 001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
00200000 - 03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
04000000 - 7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
實際表示ASCII字元的UNICODE字元,將會編碼成1個位元組,並且UTF-8表示與ASCII字元表示是一樣的。所有其他的UNCODE字元轉化成UTF-8將需要至少2個位元組。
以上是網上找的utf8編碼介紹,對於這個轉換表可以看作一個模板,對於以標示的二進位制位值是固定的,XX位是將字元以unicode編碼,然後根據值的大小分段,決定使用哪個模板,高位在前的次序填入XX位.
ascii佔用一個位元組,一般我們見到的其它字元都是佔用3個位元組,套用00000800 - 0000FFFF 1110xxxx 10xxxxxx 10xxxxxx這個模板,這樣第一個位元組就是>=11100000(&HE0) and < 11110000(&HF0),後面兩個位元組>=10xxxxxx(&H80) and < 11000000(&HC0),我們就可以根據這點來寫程式碼了,符合這個規則的都被判為utf8,否則為ansi.
VB.net程式碼如下:
Function OnUtf8(ByVal byts() As Byte) As Boolean
Try
Dim i As Int32, AscN As Int32
Do While i <= UBound(byts)
If byts(i) < 128 Then
i += 1 'ascii字元
AscN += 1
ElseIf (byts(i) And &HE0) = &HC0 And (byts(i + 1) And &HC0) = &H80 Then
i += 2 '2個位元組的utf8
ElseIf (byts(i) And &HF0) = &HE0 And (byts(i + 1) And &HC0) = &H80 And (byts(i + 2) And &HC0) = &H80 Then
i += 3 '3個位元組的utf8
Else
Return False
End If
Loop
'這個判斷可以不要,當全部是ascii字元時,被劃分到哪種編碼
If AscN = byts.Length Then
Return False
Else
Return True
End If
Catch ex As Exception
'MsgBox(ex.Message)
End Try
End Function
這種判斷法,一般的字元都可以正確判斷,可踫上特殊的就會變成亂碼,像比較普通的"聯通"兩個字,還有"戟半丁","戟廣發"等等,像這種組合正好落在這個判斷內就會把本來的ansi編碼識別為utf8,從而變成亂碼,系統自帶的記事本用的判斷法應該和這個差不多,對於以上的特殊字眼用ansi編碼儲存後,再開啟同樣是亂碼,為什麼要讓無BOM的utf8編碼存在了,雖然這種情況很少見.
相關推薦
無BOM utf8編碼判斷
BOM(Byte Order Mark)是一個字元,它表明UNICODE文字的UTF-16,UTF-32的編碼位元組順序(高位元組低位元組順序)和編碼方式(UTF-8,UTF-16,UTF-32, 其中UTF-8編碼是位元組順序無關的)。 如下所示:Encoding Repr
JAVA 無BOM utf8檔案編碼判斷
/** * @Comments :獲取檔案編碼格式 * @param fileName * @return */ private static String getCharset(File fileName) { BufferedInputStrea
因字符集utf-8無BOM格式編碼,導致用sql檔案匯入MySQL出現亂碼問題
在使用.sql檔案向MySQL資料庫插入時,部分中文字元出現亂碼,不能匯入,比如說“交通”、“釀”、“制”等。 sql語句: INSERT INTO `course` VALUES (1,'交通',901); 報錯:You have an error in your S
如何檢測或判斷一個檔案或位元組流(無BOM)是什麼編碼型別
前言: 不小心看到一條留言: 然後就去該地址看了一下,這一看,順帶折騰了一天。 今天,就和大夥分享下折騰的感覺。 在該開源地址中,程式碼有C++和C#兩個版本,編碼的整體風格傾向與於C++。 主要的時間,花了在對於檢測無BOM的部分,順帶重溫了各種編碼的基礎。 建議在看此文之前,先了解下編
utf-8無BOM編碼格式什麼意思?
UTF-8不需要BOM來表明位元組順序,但可以用BOM來表明編碼方式。字元"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF。所以如果接收者收到以EF BB BF開頭的位元組流,就知道這是UTF-8編碼了。 ---------------
utf8編碼檔案的bom頭
1.在window下可用editplus等軟體去掉bom頭,方法如下 1.1.用editplus開啟檔案 1.2.文件=》引數設定=》檔案=》UTF-8簽名:選擇“總是移除簽名”=》確定 1.3.再儲存一下當前的檔案即可去掉bom頭 說明
VBA 格式化輸出XML(UTF-8無BOM編碼)
VBA可以使用MSXML2.Document來建立XML Dom樹並輸出到檔案,先看個簡單的例子: Function CreateXml(xmlFile As String) Dim xDoc As Object Dim rootNode As
CStdioFile的Writestring寫入中文的總結(unicode-ucs2/utf8-無Bom/ansi-gb2312)
參考: (注:位元組序為little-endian 更新20130809) 關於CString的字串結束符 使用Writestring的話和TCHAR型別相關性非常強,我們來看看CString: 1. 先討論結字串的結束符,對於char型的話是
讀取xml格式utf-8編碼 和utf-8 無bom編碼格式,出現 前言中不允許有內容的問題
1,java 讀取 xml utf-8 編碼格式的檔案,出現 Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允許有內容。 出現這樣的原因, 是因為讀取檔案
VS 修改預設編碼格式 為utf-8 無 BOM 與 utf-8 帶BOM
VS 在使用的時候預設的編碼格式為 GB2312 如何修改預設的編碼格式呢? 網上都說修改 VS 建立檔案時的模板 如C++ 則修改 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcprojectitems
CStdioFile的ReadString讀入中英文的總結(unicode-ucs2/utf8-無bom/ansi) .
文章的前提: 1. 使用ReadString來讀取字串. sizeof(TCHAR) == 2 為 wchar_t. // 原因通常TCHAR == char時,通常使用不會有問題發生,所以文章不再討論。 1. Read文字為utf8/ansi格式: 這種情況
C#使用StreamWriter生成UTF-8無BOM編碼格式
使用UTF-8格式產生的檔案,用二進位制檢視會多出“\xef\xbb\xbf”幾個位元組 使用UTF-8無BOM格式: UTF8Encodingutf8 = new UTF8Encoding(fal
cocos2dx --- VS 使用utf8 編碼問題
spa strong data cocos2dx img cocos xheditor ng- cocos2d 做cocos2dx項目,SVN存的代碼的編碼是格式是: UTF8 -BOM 但在VS下編譯不能通過。Google百度後,才知道VS支持的UTF8格式是+
Maven設置utf8編碼格式
put logs per epo utf8編碼 nco project out tin 在pom.xml添加如下配置即可 <properties> <project.build.sourceEncoding>UTF-8</pro
UTF-8和UTF-8無BOM,一個會導致文件中中文變量無法匹配的bug
阿裏旺旺 bsp bom logs 文件 匹配 文件的 程序 資料 昨晚用dom4j中的selectSingleNode解析xml,匹配節點。 發現匹配不到,但是確實存在該節點 將regex改為regex1後則可以匹配,也就是說文件中的“阿裏旺旺”和程序中的“阿裏旺旺
Visual Studio 2017 UTF-8 無 BOM 一站式解決辦法
exe end pre utf8 space spa code ets mic 問題背景:最近撿起C++,使用VS 2017平臺。因為以前的編程習慣,喜歡使用UTF-8 無 BOM 的編碼格式,好讓自己的代碼全球通用。但是VS 2017 對這個問題不是很友善。但最終找到了解
轉為utf8編碼的正確姿勢
最近發現專案裡面有的檔案eclipse開啟為亂碼,顯然這是由於有的同事不小心把GBK編碼的檔案提交到SVN。 強迫症發作,全部改為utf-8,使用的工具是Notepad++。結果是悲劇,提交程式碼之後,部署時編譯報錯,整整 停了2個小時測試環境才恢復。雖然是極其簡單的事,我覺得還是有必要
Python2編碼判斷Demo
def unicode_it(html): if isinstance(html, str): r = chardet.detect(html) if r["confidence"] >= 0.7: encoding
UTF8編碼位元組流錯誤小析
對於對稱加密,首先生成位元組流形式的key與iv,之後對指定字串進行加密,然後將key與iv轉換為字串傳輸到另一端,另一端再將字串轉換回位元組流完成解密工作.在key與iv的位元組流與字串之間的轉換中如果選用Utf8編碼,則可能會讓轉換回的二進位制流與之前的位元組流不一致.程式碼如下:
C/CPP UTF8編碼轉成漢字 \u7528\u6237\u4e0d
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!