windows下利用标准库fopen以UTF-8格式打开一个文件,要注意下面几个问题.
1.如果文件编码为UNICODE(UTF-8),有两种情况:
1)没有BOM头,调用fopen必须指定css=UTF-8.
2)有BOM头,调用fopen不要指定css=UTF-8.
2.文件编码为其它格式(如ANSI),调用fopen必须指定css=UTF-8.
fopen打开其它UNICODE(如UTF-16LE,UNICODE)等,与此类似,只是BOM头不相同.
例如
记事本中如果保存编码格式为Unicode big endian,则无法使用 ccs=UNICODE 这个功能
如果用了ccs=UNICODE,则必须使用宽字符格式的相应函数,即便文件本身编码是ANSI格式
参考下面两篇文章:
VC2005中fopen的ccs=UNICODE实测<zt> + UTF8 如何转变为 ansi
windows系统中utf-8格式文本
附:
BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF BB BF。这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。微软做这种检测,但有些软件不做这种检测,而把它当作正常字符处理。
微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8文本文件做个这样的标记。
也就是说一个UTF-8文件可能有BOM,也可能没有BOM,那么怎么区分呢?三种方法。1,用UltraEdit-32打开文件,切换到十六进制编辑模式,察看文件头部是否有EF BB BF。2,用Dreamweaver打开,察看页面属性,看“包括Unicode签名BOM”前面是否有个勾。3,用Windows的记事本打开,选择“另存为”,看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM。