UTF-8与UTF-8 without BOM

UTF-8编码的文件可以分为without BOM和BOM两种格式。

何谓BOM? “EF BB BF” 这三个字节就叫BOM,BOM的全称叫做"Byte Order Mark". 在UTF-8文件中常用BOM来表明这个文件是UTF-8文件, 而BOM的本意是在UTF-16中用来表示高低字节序列的。在字节流之前有BOM表示采用低字节序列(低字节在前面),而UTF-8不用考虑字节序列,所以其实有无BOM都可以。UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是 “奎”还是“乙”?

如果文件保存时,选择了使用BOM,那么就可能会出现headers already sent的问题。
因为Web服务器软件可能不认识BOM,所以就把BOM的两个特殊字节当做字符发送给浏览器了。
这时再调用session_start()等函数,就会出现headers already sent的问题。
所以解决此问题最根本的方法就是在保存UTF-8编码的文件时,不要使用BOM。

微软的记事本Word等只能正确打开含BOM的UTF8文件,然而UltraEdit却恰恰相反,会把BOM UTF-8文件误认为ascii编码。
UTF-8的BOM是 EFBBBF,因为UE载入UTF-8文件会转成Utf16,上述的EFBBBF 在Utf16中是FFFE(Unicode-LE的BOM),UltraEdit不认识BOM又加多一個BOM,所以有2个FFFE。文件就被它破坏了。

当应用程序的文件使用 UTF8 编码时,在保存文件时,一定要注意 BOM 的问题。那么如何将UTF8 without BOM转换成UTF8呢?

using (TextReader input = new StreamReader(new FileStream(@"C:\Test.properties", FileMode.Open), Encoding.UTF8))
{
    using (TextWriter output = new StreamWriter(new FileStream(@"C:\Test2.lmx", FileMode.Create), Encoding.UTF8))
    {
        int BufferSize = 8096;
        char[] buffer = new char[i];
        int len;
 
        while ((len = input.Read(buffer, 0, i)) > 0)
        {
            output.Write(buffer, 0, len);
        }
 
        input.Close();
    }
}

http://www.cnblogs.com/zhongru_tu/archive/2008/04/11/1147792.html

因为文本是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。

使用Windows的童鞋要特别注意:

千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议你下载Notepad++代替记事本,不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF-8 without BOM即可

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743256916071d599b3aed534aaab22a0db6c4e07fd0000

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值