1. 程式人生 > >無BOM utf8編碼判斷

無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-8BOM格式編碼,導致用sql檔案匯入MySQL出現亂碼問題

在使用.sql檔案向MySQL資料庫插入時,部分中文字元出現亂碼,不能匯入,比如說“交通”、“釀”、“制”等。 sql語句: INSERT INTO `course` VALUES (1,'交通',901); 報錯:You have an error in your S

如何檢測或判斷一個檔案或位元組流(BOM)是什麼編碼型別

前言: 不小心看到一條留言: 然後就去該地址看了一下,這一看,順帶折騰了一天。 今天,就和大夥分享下折騰的感覺。 在該開源地址中,程式碼有C++和C#兩個版本,編碼的整體風格傾向與於C++。 主要的時間,花了在對於檢測無BOM的部分,順帶重溫了各種編碼的基礎。 建議在看此文之前,先了解下編

utf-8BOM編碼格式什麼意思?

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-8BOM編碼)

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-8BOM編碼格式

使用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-8BOM,一個會導致文件中中文變量無法匹配的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 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!