精华内容
下载资源
问答
  • Windows系统使用带BOM(Byte Order Mark)UTF-8编码的可以通过文件前三个字节来判断:EF BB BFUTF-8编码规则:1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;2. n个...

    UTF-8是一种变长的编码方式,节省存储空间,适用于互联网传输。

    Windows系统使用带BOM(Byte Order Mark)UTF-8编码的可以通过文件前三个字节来判断:

    EF BB BF

    UTF-8编码规则:

    1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;

    2. n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。

    c34daba657b1668f7e8ab71f31a74a95.png

    “好”字的Unicode编码是:597D(0101 1001 0111 1101),属于上图中3个字节序列,从右往左依次填充其中的“x“,不足补0,得到11100101 10100101 10111101

    得到“好”的UTF-8编码:E5A5BD

    注:如果文件基本是中文字符,使用GBK编码(汉字2个字节)相比UTF-8编码存储更有优势。

    下面是利用Java判断字节数组是否为非BOM的UTF-8编码

    public static boolean validUTF8(byte[] bytes, int len) {   int expectedLen;   for (int i = 0; i < len; i++) {      // Lead byte analysis      if      ((bytes[i] & 0b10000000) == 0b00000000) continue;      else if ((bytes[i] & 0b11100000) == 0b11000000) expectedLen = 2;      else if ((bytes[i] & 0b11110000) == 0b11100000) expectedLen = 3;      else if ((bytes[i] & 0b11111000) == 0b11110000) expectedLen = 4;      else if ((bytes[i] & 0b11111100) == 0b11111000) expectedLen = 5;      else if ((bytes[i] & 0b11111110) == 0b11111100) expectedLen = 6;      else    return false;      // Count trailing bytes      while (--expectedLen > 0) {         if (++i >= len) {            return false;         }         if ((bytes[i] & 0b11000000) != 0b10000000) {            return false;         }      }   }   return true;}
    	
    展开全文
  • 在不同的Unicode编码中,对应的bom的二进制字节如下: FE FF UTF16BEFF FE UTF16LEEF BB BF UTF8 所以我们可以根据文件头部的几个字节和上面的表格对应来判断该文件是哪种编码形式。 2.存在的问题 虽然BOM字符起到...

    1.什么是BOM

    BOM是用来判断文本文件是哪一种Unicode编码的标记,其本身是一个Unicode字符(""),位于文本文件头部。

    在不同的Unicode编码中,对应的bom的二进制字节如下:

    FE FF UTF16BE
    FF FE UTF16LE
    EF BB BF UTF8

    所以我们可以根据文件头部的几个字节和上面的表格对应来判断该文件是哪种编码形式。


    2.存在的问题

    虽然BOM字符起到了标记文件编码的作用但是他并不属于文件的内容部分,所以会产生一些问题:

    1.在某些使用场景下就会有问题。例如我们把几个JS文件合并成一个文件后,如果文件中间含有BOM字符,就会导致浏览器JS语法错误。

    2.PHP就不能识别bom头,PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。由此造成即使页面的top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个字符呢!


    3. 如何去掉UTF8编码的记事本文件的BOM头

    使用notepad++的时候选择设置无BOM头的UTF8编码

    72c5941b04f0e3aef4622ffe5c0f092a.png
    3ff812628a3110e4bcc97a636c4b480b.gif
    6f3c786abe737f58292e6f92f2ff9047.png
    展开全文
  • 首先普及下知识: 1、BOM: Byte Order Mark  BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,... Byte-order mark Description EF BB BF UTF-8 FF FE UTF-16 aka UCS-2, little endian ...

    首先普及下知识:

    1、BOM: Byte Order Mark

      BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,但是BOM虽然在编辑器中不显示,但是会产生输出,就像多了一个空行。

      Byte-order mark Description 
        EF BB BF UTF-8 
        FF FE UTF-16 aka UCS-2, little endian 
        FE FF UTF-16 aka UCS-2, big endian 
        00 00 FF FE UTF-32 aka UCS-4, little endian. 
        00 00 FE FF UTF-32 aka UCS-4, big-endian.

      所以对于UTF8只要判断文件头包含EF BB BF,就可以判断它是有BOM的了。

    2、再了解下UTF8的具体编码格式,UTF8算是一种自适应的,长度不定,兼容ASCII编码。

      

    unicode(U+) utf-8
    U+00000000 - U+0000007F: 0xxxxxxx
    U+00000080 - U+000007FF: 110xxxxx10xxxxxx
    U+00000800 - U+0000FFFF: 1110xxxx10xxxxxx10xxxxxx
    U+00010000 - U+001FFFFF: 11110xxx10xxxxxx10xxxxxx10xxxxxx

      也就是说,在Unicode的编码的基础上规定了一种编码格式,根据每个字节的开头的固定格式,我们就可以判断是否是UTF8的编码

         OK 基础知识大致普及完毕,然后看一看代码的实现。

    #!/usr/bin/env python
    #coding:utf-8
    import  sys,codecs
    
    def detectUTF8(file_name):
        state = 0
        line_num = 0
        file_obj = open(file_name)
        all_lines = file_obj.readlines()
        file_obj.close()
        for line in all_lines:
            line_num += 1
            line_len = len(line)
            for index in range(line_len):
                if state == 0:
                    if ord(line[index])&0x80 == 0x00:#上表中的第一种情况
                        state = 0
                    elif ord(line[index])&0xE0 == 0xC0:#上表中的第二种情况
                        state = 1
                    elif ord(line[index])&0xF0 == 0xE0:#第三种
                        state = 2
                    elif ord(line[index])&0xF8 == 0xF0:#第四种
                        state = 3
                    else:
                        print "%s isn't a utf8 file,line:\t"%file_name+str(line_num)
                        sys.exit(1)
                else:
                    if not ord(line[index])&0xC0 == 0x80:
                        print "%s isn't a utf8 file in line:\t"%file_name+str(line_num)
                        sys.exit(1)
                    state -= 1
        if existBOM(file_name):
            print "%s isn't a standard utf8 file,include BOM header."%file_name
            sys.exit(1)
    
    def existBOM(file_name):
        file_obj = open(file_name,'r')
        code = file_obj.read(3)
        file_obj.close()
        if code == codecs.BOM_UTF8:#判断是否包含EF BB BF
            return  True
        return False
    
    if __name__ == "__main__":
        file_name = 'code.txt'
        detectUTF8(file_name)
    

    OK,大致就是这些,只要熟悉编码格式,python代码的实现也就不算难。

     

    PS:python的编码真是太痛苦了,不同版本还有所不同。如果在导入其它的模块也可能出现编码问题。。。

    转载于:https://www.cnblogs.com/ferraborghini/p/4951102.html

    展开全文
  • 前端项目运行后浏览器能识别html,但是... 查看target后中文显示正常,应该就不是tomcat 的原因 单独用notepad++转为utf8 BOM编码浏览器就能正常显示 但是这样效率太低了 有没有能让浏览器判断utf8 无BOM的编码呢?
  • 无BOM utf8编码判断

    2009-06-19 13:34:31
    BOM(Byte Order Mark)是一个字符,它表明UNICODE文本的UTF-16,UTF-32的编码字节顺序(高字节低字节顺序)和编码方式(UTF-8,UTF-16,UTF-32, 其中UTF-8编码是字节顺序无关的)。 如下所示:Encoding ...

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

    展开全文
  • JAVA 无BOM utf8文件编码判断

    千次阅读 2016-02-26 17:27:02
    /** * @Comments :获取文件编码格式 * @param fileName * @return */ private static String getCharset(File fileName) { BufferedInputStream... int bom = 0; String str = " "; String str2 = "";
  • 用VBS判断无BOM头的文件是否UTF-8编码

    千次阅读 2014-11-15 22:39:22
    标题: 用VBS判断无BOM头的文件是否UTF-8编码 作者: Demon 链接: http://demon.tw/programming/vbs-validate-utf8.html 版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议...
  • 根据 •0xxxxxxx ASCII < 0x80 (128) •110xxxxx 10xxxxxx 2-byte >= 0x80 •1110xxxx 10xxxxxx 10xxxxxx 3-byte >... •11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4-...utf-8编码的特征,怎样编写呢?谢谢。
  • 前一段时间写PHP,经常在解析文件之前就要对数据进行处理判断,并以header()的...后来发现是文件编码格式的原因,转换成以UTF-8无BOM编码格式的文件就不会报错了。 附上BOM的解释:https://en.wikipedia.org/wik...
  • 最近在项目开发过程中遇到一个编码上的问题,原流程是用户上传csv数据并对数据入库。...我们日常用到的编码格式大体就那么几种,最常见的有UTF-8(带BOM)、UTF-8无BOM、GBK。其中UTF-8(带BOM)的最好区分,从文件头拿三
  • Encoding GetBytesEncoding(byte[] bs) { int len = bs.Length; if (len >= 3 && bs[0] == 0xEF && bs[1] == 0xBB && bs[2] == 0xBF) { return Encoding.UTF8; } int[] cs = { 7, 5, 4,
  • c语言如何识别无BOMUTF8文本

    千次阅读 2017-01-28 20:49:44
    UTF-8编码的文本文档,有的带有BOM (Byte Order Mark, 字节序标志),即0xEF, 0xBB, 0xBF,有的没有。...但是,如果文档不带有BOM,就无法根据BOM做出判断,那么那在编程判断时就要根据UTF-8字符编码的规律进行判断了。
  • '直接用下面代码调用即可'Str 为文本,Filepath 为文本文件的路径例:call ToUtf8("AA","d:\abc.txt")代码Private Sub ToUtf8(Str$, Filepath$)Dim OutSt As Object, BinSt As ObjectSet OutSt = CreateObject(...
  • 大家知道判断一个文件编码如若有BOM位(方便编辑器识别是何种编码,在文件开头处加的标志位,我是这样理解BOM的,并且我们用一般的编辑器打开是看不到BOM位的,我们必须用能二进制编辑的编辑器打开才看得到BOM位),...
  • 展开全部在此列举以下两种去除方法:(1)在notepad++等高级记事本中可以直接转换为无BOM格式的62616964757a686964616fe78988e69d8331333361326233utf-8文件(2)用python脚本解决BOM时一串16进制字符串,在python中表示...
  • 判断是否utf8编码的算法

    千次阅读 2013-11-29 13:16:22
    问题:由于utf8编码分为有bom头和无bom头,而有bom头的编码很好判断,如果前三个字节是0xE 0xBB 0xBF,那么就是utf8带bom的编码,如果没有bom头,则不能好快的判断到底是utf8还是ansi编码,因为他们都没有头,且全...
  • 所以在上一篇文章的基础上,增加对无BOM文本的判断。要百分百准确判断一个文件的编码是很难的,但是判断文本是否UTF-8编码就相对简单。用正则表达式遍历数据就可以判断,网上也有参考代码。整理代码如下:Sub Gc()...
  • 网上相关的方法很多,另存为无bom格式的,是最直接了当的方法 但是,我另存了之后,也还是出错,貌似没效果 于是,还是决定从代码中qu去除掉\xef\xbb\xbf 网上的方法很多,大多数是针对zhen整个文件的头部有\xe.....
  • 其中ANSI在中国大陆即为GBK(以前是GB2312),最常用的是 GBK 和 UTF8无BOM 编码格式。后面三个都是有BOM头的文本格式,UCS-2即为人们常说的Unicode编码,又分为大端、小端。所谓BOM头(Byte Order Mark)就是文本...
  • 当有签名的UTF-8编码内容被解析器解析时,解析器直接根据签名即可判断出使用UTF-8编码来进行解析,当签名时,解析器会根据内容的编码来进行判别。所以,有签名的将更容易被解析器以正确的编码方式进行解析。 有...
  • C++实现文本编码判断

    2020-05-02 18:50:52
    C++实现对utf-8,utf-8(BOM),utf-16 LE,utf-16 BE编码的文本文件进行编码判断,其中多数编码均有固定文件头,在此不赘述,难点在于utf-8(无BOM)的判断。 2.代码实现 ///传入参数为文件名,返回值为编码名称 ...
  • 2、问题是:txt不能更改为无bomutf-8,如果使用python的open打开也必须指定encoding=utf-8或者rb,而且第一个数据前面都有\ufeff。 但是libsvm不能指定第二个参数,永远报错_UnicodeDecodeError: 'gbk' codec can...
  • python判断文件和字符串编码类型可以用chardet工具包,可以识别大多数的编码类型。但是前几天在读取一个Windows记事本保存的txt文件时,GBK...# UTF-8 BOM前缀字节 UTF_8_BOM = b'\xef\xbb\xbf' # 获取文件编码类型 def
  • Android判断文本编码格式

    千次阅读 2018-12-13 18:19:05
    前几天项目中有这样的需求:客户端需要在服务器下载一个文本文件显示出来。...虽然在Windows上utf-8的编码都默认添加BOM头,但是也可以使用无BOM头的UTF-8来保存的,而在mac上默认的UTF-8都是无BOM的编码格式,所以...

空空如也

空空如也

1 2
收藏数 40
精华内容 16
关键字:

判断utf8无bom