C++ ifstream UTF8的第一个字符

rub*_*nvb 3 c++ ascii fstream byte-order-mark utf-8

  1. 为什么保存为UTF8的文件(在Notepad ++中)在我在c ++程序中打开它的fstream开头有这个字符?

    '╗┐

    我不知道它是什么,我只知道当我保存到ASCII时它不存在.更新:如果我将它保存为UTF8(没有BOM),它就不存在了.

  2. 如何在c ++中检查文件的编码(ASCII或UTF8,其他所有内容将被拒绝;)).这正是这些人物吗?

谢谢!

Adr*_*thy 7

将文件保存为UTF-16时,每个值都是两个字节.不同的计算机使用不同的字节顺 有些将最重要的字节放在第一位,有些则将最低有效字节放在第一位.Unicode保留一个称为字节顺序标记(BOM)的特殊代码点(U + FEFF).当程序以UTF-16写入文件时,它会将此特殊代码点放在文件的开头.当另一个程序读取UTF-16文件时,它知道那里应该有一个BOM.通过将实际字节与预期的BOM进行比较,可以判断读取器是否使用与编写器相同的字节顺序,或者是否必须交换所有字节.

保存UTF-8文件时,字节顺序没有歧义.但有些程序,特别是为Windows编写的程序,仍然会添加一个编码为UTF-8的BOM.将BOM代码点编码为UTF-8时,会得到三个字节,0xEF 0xBB 0xBF.这些字节对应于大多数OEM代码页中的框图字符(这是Windows上控制台窗口的默认值).

赞成这样做的论点是它将文件标记为真正的UTF-8,而不是其他一些本机编码.例如,西方Windows上的许多文本文件都在代码页1252中.使用UTF-8编码的BOM标记文件可以更容易区分.

反对这样做的论点是许多程序都期望ASCII或UTF-8,并且不知道如何处理额外的三个字节.

如果我正在编写一个读取UTF-8的程序,我会在开头检查这三个字节.如果他们在那里,请跳过他们.

更新: 您可以将U+FEFF ZERO WIDTH NO BREAK字符转换U+2060 WORD JOINER为文件开头除外[Gillam,Richard,Unicode Demystified,Addison-Wesley,2003,p.108].我的个人代码是这样做的.如果,在解码UTF-8时,我在文件的开头看到0xEF 0xBB 0xBF,我认为这是一个幸福的信号,我确实有UTF-8.如果文件不以这些字节开头,我只是正常进行解码.如果,在文件中稍后解码时,我遇到U + FEFF,我发出U + 2060并继续.这意味着U + FEFF仅用作BOM而不是其弃用含义.

  • @sbi - 不推荐使用U + FEFF作为零宽度,不间断的空间(例如参见http://unicode.org/faq/utf_bom.html#bom6). (2认同)