对码当歌,猿生几何?

C语言中编码中BOM问题

问题描述

输出的csv文件显示乱码,是因为输出的文件是utf8编码,但是没有输出BOM,所以显示乱码。一些系统如window就是使用BOM来判断文件编码方式的。

什么是BOM?

在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
Windows就是使用BOM来标记文本文件的编码方式的。

常见的编码对应的BOM

ANSI                               无格式定义(第一个字节开始就是文件内容)             对于中文编码格式是GB2312;

Unicode                          文本里前两个字节为FF FE                                  字节流是little endian

Unicode  big endian         文本里前两个字节为FE FF                                   字节流是big  endian

UTF-8                            前两字节为EF BB,第三字节为BF                        带bom

C语言实现添加BOM

fputc(0xEF, fp);

fputc(0xBB, fp);

fputc(0xBF, fp);