如何判断文件的编码方式

原创 2015年11月19日 16:13:30

最近做东西需要知道文件(txt,html...)究竟是什么编码方式,不然读取文件内容可能出现乱码:

经过网上查找发现两种总结一下,方便自己也方便别人:

①通过判断文件头,不过文件头不是必须的,所以有些文件是没有文件头的

/*
        EF BB BF    UTF-8  
        FE FF     UTF-16/UCS-2, little endian  
        FF FE     UTF-16/UCS-2, big endian  
        FF FE 00 00  UTF-32/UCS-4, little endian.  
        00 00 FE FF  UTF-32/UCS-4, big-endian.

*/

参考代码:

        BYTE hdBuf[3];
        file.Read(hdBuf, 3); //读取文件头来判断是哪种类型
        file.SeekToBegin();
        if(hdBuf[0] == strtoul(_T("ff"), NULL, 16) && hdBuf[1] == strtoul(_T("fe"), NULL,16))
        {
            //unicode
        }
        else if (hdBuf[0] == strtoul(_T("fe"), NULL, 16) && hdBuf[1] == strtoul(_T("ff"), NULL, 16))
        {
            //unicode big endian
        }
        else if(hdBuf[0] == strtoul(_T("ef"), NULL,16) &&
            hdBuf[1] == strtoul(_T("bb"), NULL, 16)&&
            hdBuf[2] == strtoul(_T("bf"), NULL, 16)) //utf8
        {
            //utf8
        }
        else
        {
            //ansi
        }


②判断文本是否是utf8,在网上看到的,测试未发现问题,有待进一步验证

参考代码:

inline bool IsTextUTF8(char* str,ULONGLONG length)
{
    DWORD nBytes = 0;                //UFT8可用1-6个字节编码,ASCII用一个字节
    UCHAR chr;
    BOOL bAllAscii = true;            //如果全部都是ASCII, 说明不是UTF-8
    for(int i = 0;i < length;i++)
    {
        chr = *(str+i);
        if( (chr&0x80) != 0 )        // 判断是否ASCII编码,如果不是,说明有可能是UTF-8,ASCII用7位编码,但用一个字节存,最高位标记为0,o0xxxxxxx
            bAllAscii = false;
        if(nBytes == 0)                //如果不是ASCII码,应该是多字节符,计算字节数
        {
            if(chr >= 0x80)
            {
                if(chr >= 0xFC && chr <= 0xFD)
                    nBytes = 6;
                else if(chr >= 0xF8)
                    nBytes = 5;
                else if(chr >= 0xF0)
                    nBytes = 4;
                else if(chr >= 0xE0)
                    nBytes = 3;
                else if(chr >= 0xC0)
                    nBytes = 2;
                else
                {
                    return false;
                }
                nBytes--;
            }
        }
        else //多字节符的非首字节,应为10xxxxxx
        {
            if( (chr&0xC0) != 0x80 )
            {
                return false;
            }
            nBytes--;
        }
    }
    if( nBytes > 0 ) //违返规则
    {
        return false;
    }
    if( bAllAscii ) //如果全部都是ASCII, 说明不是UTF-8
    {
        return false;
    }
    return true;
}


③windows自带的IsTextUnicode函数,是不靠谱的,如果只是估计那当然没问题了。

使用 iconv 自动判断文件编码

做项目的时候,文件编码为UTF-8,需要临时转码到GBK,开始的时候用 iconv 来转换,很简单。不久之后,项目扩大,需要处理 源代码为 GBK 的文件,当一个GBK的文件被拿给 iconv 做转换...
  • darennet
  • darennet
  • 2013年06月02日 22:35
  • 4321

判断一个文本文件的编码格式

http://www.cnblogs.com/swtseaman/archive/2011/05/17/2048689.html 文件的字符集在Windows下有两种,一种是ANSI,一种Unic...
  • cs_21cn
  • cs_21cn
  • 2016年03月01日 18:16
  • 1411

【iOS】如何判断文本文件的字符编码格式

总体思路:遍历所有的字符编码,能正确读取输出转换的编码格式就可以理解为该文本的编码格式。...
  • lotusiki
  • lotusiki
  • 2014年07月22日 21:36
  • 2246

如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)

UTF-8编码的文本文档,有的带有BOM (Byte Order Mark, 字节序标志),即0xEF, 0xBB, 0xBF,有的没有。Windows下的txt文本编辑器在保存UTF-8格式的文本文...
  • jiangqin115
  • jiangqin115
  • 2015年01月13日 21:13
  • 6577

判断是哪一种编码格式

截取出来的字符串中文乱码 #if 0     NSString *retStr;          // 1,utf8编码的     NSStringEncoding...
  • ios_xumin
  • ios_xumin
  • 2017年03月08日 15:18
  • 297

C# 获取文本文件的编码,自动区分GB2312和UTF8

以下是获取文件编码的一个类 using System; using System.IO; using System.Text; /// /// FileEncoding 的摘要说...
  • ybhjx
  • ybhjx
  • 2016年08月14日 19:24
  • 1230

C#获取文本文件的编码,自动区分GB2312和UTF8

以下是获取文件编码的一个类 using System; using System.IO; using System.Text; /// /// FileEncoding 的摘要说明...
  • dqswuyundong
  • dqswuyundong
  • 2014年10月22日 15:03
  • 3143

java 怎么判断文本内容的编码格式

java 怎么判断文本内容的编码格式
  • IRhythm
  • IRhythm
  • 2016年05月07日 11:16
  • 3933

delphi 如何判断编码格式,解决乱码问题

前阵子因为需要用到idhttp下载网页,然而令人很生气的是,他下载的html源码是乱码的,这样子是没有办法使用的,所以就必须要把他进行编码格式转换,然而令人困扰的是,他是什么格式,又该怎么转,转成什么...
  • u014028956
  • u014028956
  • 2016年01月24日 15:56
  • 3702

如何使用Java代码获取文件、文件流或字符串的编码方式

如何使用Java代码获取文件、文件流或字符串的编码方式
  • wangshuxuncom
  • wangshuxuncom
  • 2015年02月11日 17:16
  • 3390
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何判断文件的编码方式
举报原因:
原因补充:

(最多只允许输入30个字)