UTF-8编码的文件有without BOM和BOM两种格式,最好使用UTF-8 without BOM格式。

  1. BOM的含义
    BOM,即Byte Order Mark,意为字节序标记。UTF-8编码的文件中,BOM占三个字节。如果用记事本把一个文本文件另存为UTF-8编码方式的话,用UE打开这个文件,切换到十六进制编辑状态就可以看到开头的FFFE了,软件通过BOM来识别这个文件是否是UTF-8编码。
    BOM的本意是在UTF-16中用来表示高低字节序列的。在字节流之前有BOM表示采用低字节序列(低字节在前面),而UTF-8不用考虑字节序列,所以其实有无BOM都可以。

  2. 使用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();}
}

微软的记事本就是在 UTF-8 文件开头加 BOM,所以最好不要用记事本来编辑UTF-8文件。

推荐使用 Notepad++ 并将编码设为UTF-8 without BOM 来进行编辑,也可以使用其它文本编辑软件转储为UTF-8 without BOM 格式。

UTF-8 without BOM相关推荐

  1. ElasticSearch 知识点整理(入门)

    1:es介绍 Elasticsearch是一个基于Lucene的实时的分布式搜索和分析引擎.设计用于云计算中, 能够达到实时搜索,稳定,可靠,快速,安装使用方便.基于RESTful接口. 普通请求是. ...

  2. UTF8,Unicode 的区别(zt)

    UTF8并不算是一种电脑编码,而是一种储存和传送的格式,如前所述,每个Unicode/UCS字符都以 2或4个bytes来储存,看看以下的比较:    以"I am Chinese" ...

  3. 追本溯源:字符串及编码

    转载:https://zhuanlan.zhihu.com/p/73917931 开始 先考虑下边的问题. let s = "js" console.log(s.length) s ...

  4. response setHeader 设置下载中文文件名乱码问题

    1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cache-Control , Connecti ...

  5. response.setHeader()设置下载中文文件名乱码问题

    1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cache-Control , Connecti ...

  6. 使用charCodeAt()和charAt()方法,根据Unicode 编码,转换字符

    1.charCodeAt() 方法 charCodeAt() 方法可返回指定位置的字符的 Unicode 编码.这个返回值是 0 - 65535 之间的整数. 方法 charCodeAt() 与 ch ...

  7. UTF-8,UTF-16,UTF-32编码方式都是UNICODE,但只是他们的保存方式不同。

    这是转载自网络上的博文,UTF-8,UTF-16,UTF-32编码方式都是UNICODE,但只是他们的保存方式不同. Unicode(统一码.万国码.单一码)是一种在计算机上使用的字符编码.它为每种语 ...

  8. Java 中 Unicode 和 char 的关系

    目录 Unicode 字符集的出现 字符集 ASCII 字符集 ^查看^ OEM 字符集的衍生 多字节字符集(MBCS,Multi-Byte Chactacter Set)和中文字符集 GB2312^ ...

  9. Unicode,UTF-8,UTF-16,UTF-32

    这是转载自网络上的博文,UTF-8,UTF-16,UTF-32编码方式都是UNICODE,但只是他们的保存方式不同. Unicode(统一码.万国码.单一码)是一种在计算机上使用的字符编码.它为每种语 ...

  10. java ucs 2_请问UTF-8与UCS-2之间有何区别与联系?

    Unicode - UCS - 万国码 通用字符集 - UCS(Universal Character Set) 首先要说明的是Unicode和UCS并不是完全相同的概念 Unicode的实现方式不同 ...

最新文章

  1. 面试官问:Integer 如何实现节约内存和提升性能的?
  2. 整个宇宙可能是个巨大的神经网络?看科学家们是这样解释的
  3. 面向过程、面向函数、面向对象的区别浅谈
  4. C++_类和对象_对象特性_拷贝构造函数调用时机---C++语言工作笔记042
  5. 心电图图平板运动测试软件,心电图和平板运动可以检查出心
  6. 二叉树的右视图 python_【leetcode刷题】T128-二叉树的右视图
  7. 海康视频WEB插件 V1.5.2 开发总结
  8. Oracle函数——COALESCE
  9. java开发一年后学习计划
  10. ACM河南第八届省赛题
  11. Hog源码注释(hog.cpp的注解)
  12. 计算机辅助绘图方式,计算机辅助绘图技巧
  13. 荣耀play4t手机怎么样 荣耀play4tpro手机怎么样
  14. 【新知实验室】TRTC体验
  15. 统计学习方法 - 绪论部分
  16. python+django+layUI+MySQL+TSC打印机搭建4G设备管理平台项目(二)——过程中的难点记录
  17. And and Pair
  18. 基于曲线插值的规划方法(Interpolating Curve Planners)
  19. 详解转换说明%-3d、%3d、%nd、%*2d、%0nd、%0.1f、%5.1f、%*d等含义
  20. 从陶潜的“化”到王维的“空”

热门文章

  1. python--unicode汉字编码表实现汉字输出
  2. 51单片机数码管中断倒计时报警
  3. qgc地面站如何导入离线地图_如何下载百度地图离线包并导入OruxMaps
  4. matlab液压仿真实例,基于MATLAB-simulink的液压系统动态仿真.pptx
  5. 【SVM回归预测】基于matlab布谷鸟算法优化SVM回归预测【含Matlab源码 1422期】
  6. 98版五笔字型实用学习教程
  7. 王码86五笔使用技巧
  8. 专升本高数第一章试题_专升本高数复习资料,精品系列
  9. 百度贴吧里如何留网址
  10. Cloudera迁移scm数据库