代码之家  ›  专栏  ›  技术社区  ›  rubenvb

C++ IFSUTF8首字符

  •  3
  • rubenvb  · 技术社区  · 14 年前
    1. 为什么保存为UTF8(Notepad++)的文件在我在c++程序中打开的fstream的开头有这个字符?

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

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

    5 回复  |  直到 12 年前
        1
  •  7
  •   Adrian McCarthy    12 年前

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

    赞成这样做的理由是,它将文件标记为真正的UTF-8,而不是其他一些本机编码。例如,西部窗口上的许多文本文件都在代码页1252中。用UTF-8编码的BOM标记文件,可以更容易地区分不同之处。

    反对这样做的理由是,很多程序都期望ASCII或UTF-8,而不知道如何处理额外的三个字节。

    更新: 您可以转换 U+FEFF ZERO WIDTH NO BREAK 字符到 U+2060 WORD JOINER 除了文件的开头[Gillam,Richard, Unicode解密 ,艾迪生·韦斯利,2003年,p。108]. 这是我的个人密码。如果在解码UTF-8时,我在文件的开头看到0xEF 0xBB 0xBF,我就认为这是一个好迹象,表明我确实拥有UTF-8。如果文件不是以这些字节开头,我就正常地继续解码。如果稍后在文件中解码时遇到U+FEFF,则发出U+2060并继续。这意味着U+FEFF仅用作BOM,而不是其不推荐的含义。

        2
  •  1
  •   Jerry Coffin    14 年前

    只是澄清一下,你应该意识到

        3
  •  1
  •   sbi    14 年前

    为什么文件保存为UTF8 在开头有这个字符[…]我不知道它是什么,我只知道当我保存到ASCII时它不在那里。

    U+FEFF ,一个零宽度、不间断空格字符。这里(notepad++5.4.3)保存为UTF-8的文件包含以下字符 EF BB BF 一开始。我想这就是用UTF-8编码的BOM。

    如何检查文件的编码

    你不能。你必须知道你的文件是用什么编码写的。而Unicode编码的文件 可以 从物料清单开始,我认为没有要求他们这么做。

        4
  •  1
  •   Philipp    14 年前

    关于第二点,每个有效的ASCII字符串也是一个有效的UTF-8字符串,因此不必显式地检查ASCII。只需使用UTF-8读取文件,如果文件不包含有效的UTF-8字符串,则会出现错误。

        5
  •  0
  •   SCFrench    14 年前

    我猜你是想问,为什么它有这些字符。这些角色可能是 byte order mark

    至于知道一个文件的编码是什么,你不能从文件本身派生出来。您必须提前知道它(或者询问向您提供文件的用户)。为了更好地理解编码而不必大量阅读,我强烈推荐joelspolsky的 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)