`
TonyLian
  • 浏览: 396588 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

无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编码存在了,虽然这种情况很少见.

分享到:
评论
2 楼 依舟cxj 2014-10-11  
有没有大牛人改成Java语言的啊
1 楼 z2222z 2011-08-06  
我改成易语言的了,地址在这http://bbs.eyuyan.com/read.php?tid=275255&displayMode=1

相关推荐

    无头BOM的UTF8文件判断

    NULL 博文链接:https://henry8088.iteye.com/blog/780743

    java获取文件编码(判断有无BOM)

    利用chardet,cpdetector包获取文件格式,并判断文件类型是否带BOM

    Python判断文件和字符串编码类型的实例

    python判断文件和字符串编码类型可以用chardet工具包,可以识别大多数的编码类型。但是前几天在读取一个Windows记事本保存的txt文件时,GBK却被识别成了KOI8-R,无解。 然后就自己写了个简单的编码识别方法,代码...

    Python判断中文字符串是否相等的实例

    Python判断两个相等的中文字符串为false,将两个待比较的字符串都把unicode编码设为‘utf-8’也不能解决问题,...出现编码为‘UTF-8-SIG’是因为文件在存储的时候以UTF-8格式编码保存,将文件以UTF-8无BOM格式编码存

    CTextFileIO读取不同编码文件

    CTextFileIO读取不同编码文件,可以判断UTF-8 NO BOM ,详情http://blog.csdn.net/akof1314/archive/2011/01/02/6113038.aspx

    C/C++,C#自动识别文件编码的dll,基于uchardet

    传入文件比如txt路径,返回编码字符串比如UTF-8、UTF-16、Shift_JIS等,有BOM的稳定识别,没BOM的文本文本量越大准确率越高(默认读取2048字节进行编码判断) uchardet开源库:https://code.google.com/p/uchardet/

    cleanbom:从adt迁移到android studio有可能出现:编译Java产生 illegal character

    cleanbom编译Java产生 illegal character: \65279 错误的问题是由于Windows系统开发的编码为UTF-8(BOM)导致,BOM是Byte-Order Mark的意思。一种为了让编辑器自动识别编码。在文件前3个字节加上了EE,BB,BF,但标准的...

    Universal Character Set Detector

    从Mozilla和siuying的代码中扒拉出来的文本编码自动检测模块,主要是基于字频判断,检测ANSI编码的CJK系还算比较准确,但是对于没有BOM的UTF16数据流效果很差 Code is from [siuying/UniversalDetector][1] and ...

    PHP自动识别字符集并完成转码详解

    因为自己使用字符编码一般的是utf-8编码,但如果对方的博客使用gb2312编码的话,POST...如果是文件形式的编码检查,还可以直接check utf-8的BOM信息,关于这方面的东西,大家可以看看TP工具箱的编码转换功能,我在那

    Node.js文件编码格式的转换的方法

    ASCII编码就比较蛋疼,通过搜索网上资源,反复测试对比,最终形成下面比较靠谱的方法(有一些 EditPlus显示编码为utf-8但node.js库返回的却是其它编码&gt;_&lt;) 判断修改是否无误,只需要在修改完之后,通过SVN提交,...

    关于PHP自动判断字符集并转码的详解

    如果是文件形式的编码检查,还可以直接check utf-8的BOM信息。话不多说,直接上函数,这个函数是用来对字符串进行检查和转码的。复制代码 代码如下:&lt;?phpfunction safeEncoding($string,$outEncoding =’UTF-8′)...

    JavaScript笔记

    强调:HTML、CSS、JS都要使用UTF-8编码保存(window系统) 使用js文件引入网页:[removed][removed] 强调:一旦定义src属性则其中的代码失效 解释执行:语句也可以直接写在js文件中,边解释边执行 3.***调试*** ...

Global site tag (gtag.js) - Google Analytics