代码之家  ›  专栏  ›  技术社区  ›  Dervin Thunk

猜测UTF-8编码

  •  3
  • Dervin Thunk  · 技术社区  · 15 年前

    我有一个可能很幼稚的问题,但我觉得有必要问,因为我不知道到底发生了什么。我在Ubuntu。

    假设我这样做

    echo "t" > test.txt
    

    如果我当时

    file test.txt
    

    我得到 test.txt:ASCII text

    如果我那么做

    echo "Ã¥" > test.txt
    

    然后我得到

    test.txt: UTF-8 Unicode text
    

    怎么会这样?文件如何“知道”编码,或者,它如何猜测?

    谢谢。

    4 回复  |  直到 9 年前
        1
  •  4
  •   David Z    9 年前

    有些字节序列 建议 UTF-8编码可能正在使用中(请参见 Wikipedia )如果 file 找到其中的一个或多个文件,但找不到任何在UTF-8中不能出现的内容,可以推测该文件是用UTF-8编码的。但再一次,只是一个猜测。对于基本的ASCII字符集(普通字符如 't' ,二进制表示在最常见的编码(包括UTF-8)中是相同的,因此如果文件只包含基本的ASCII字符, 文件 无法分辨许多与ASCII兼容的编码中的哪一个是有意的。默认情况下,它只与ASCII一起使用。

    另一件需要注意的是,shell被设置为使用utf-8,这就是为什么文件首先是用utf-8编写的。可以想象,您可以将shell设置为使用另一种编码,如utf-16,然后使用命令

    echo "Ã¥" > test.txt
    

    将使用UTF-16编写文件。

        2
  •  4
  •   schnaader    15 年前

    来自 file manpage :

    如果文件与 魔法文件中的条目,它是 检查看它是否是 文本文件。ASCII,ISO-8859-X,非ISO 8位扩展ASCII字符集 (例如在Macintosh和 IBM PC系统),UTF-8编码 Unicode、UTF-16编码的Unicode和 EBCDIC字符集可以是 以不同的范围区分 以及构成 每组可打印文本。如果一个文件 通过了这些测试 报告字符集。ASCII ISO-8859-X、UTF-8和扩展ASCII 文件被标识为“文本” 因为它们大部分是可读的 几乎在任何终端上;UTF-16和 EBCDIC只是“字符数据” 因为,当它们包含文本时, 需要翻译的文本 在它能被阅读之前。此外, 文件将尝试确定其他 文本类型文件的特征。如果 文件的行以 CR、CRLF或NEL,而不是 Unix标准lf,这将是 报道。包含嵌入的文件 逃逸序列或重写遗嘱 也应予以确认。

        3
  •  3
  •   Artelius    15 年前

    UTF-8是“ASCII友好型”,从某种意义上说,只包含ASCII字符的文本文件将完全相同,不管它是用ASCII还是UTF-8编码的。

    注意:有些人认为有256个ASCII字符。只有128个。ISO-8859-X是一系列编码,前128个字符是ASCII,其余是其他字符。

    此外,UTF-8的设计非常好,它提供了几个属性,例如,有些字符是用1字节编码的,有些字符是用2、3或4字节编码的,但是4字节字符永远不会包含任何较短字符的字节,3或2字节字符也不会。所有1字节字符都用字节0到127进行编码,而所有较长的字符则用128到255之间的字节序列进行编码。

    非UTF-8字节流(例如二进制文件或UTF-16文件)通常可以排除为UTF-8,因为它可能会违反这些属性。唯一的例外是普通的ASCII文件,当然可以无害地解释为UTF-8。

    所以简而言之,可以检测到UTF-8文件,因为大多数“随机”字节序列在UTF-8中都是非法的,所以不违反任何规则的东西是 很可能 成为UTF-8。

        4
  •  2
  •   Isaac    14 年前

    它在文件的最开头插入一个BOM。

    bom(byte order mark)告诉编辑器文件的编码(以及其他类似big/little endian编码的东西)

    你可以发现存在的BOM正在检查文件的大小。超过2个字节(我猜是4或5个字节)。

    This Article about BOMs 在维基百科可以帮助很多。


    更新:

    是的,我错了。

    即使有UTF-8的BOM,但大多数编辑器都有 不是 在开头插入bom,因为bom代码与ascii不兼容,而utf-8设计的目标之一是与ascii兼容。所以插入UTF-8的BOM真的很糟糕!

    所以编辑们真的 猜测 如果文件是否以UTF-8编码。


    又一个问题!:

    似乎编辑们对文件的真正编码有错误的猜测。这种情况罕见吗?很明显,小文本有更多的机会出现这种情况。