Encoding 猜测UTF-8编码

Encoding 猜测UTF-8编码,encoding,utf-8,Encoding,Utf 8,我有一个问题可能很幼稚,但我觉得有必要问,因为我真的不知道发生了什么。我在Ubuntu上 我想是的 echo "t" > test.txt 如果我当时 file test.txt 我得到test.txt:ASCII文本 如果我这样做 echo "å" > test.txt 然后我得到 test.txt: UTF-8 Unicode text 这是怎么发生的?文件如何“知道”编码,或者,它如何猜测编码 谢谢。来自: 如果某个文件与以下任何内容不匹配: 魔法文件中的条目,它是 检

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

我想是的

echo "t" > test.txt
如果我当时

file test.txt
我得到
test.txt:ASCII文本

如果我这样做

echo "å" > test.txt
然后我得到

test.txt: UTF-8 Unicode text
这是怎么发生的?文件如何“知道”编码,或者,它如何猜测编码

谢谢。

来自:

如果某个文件与以下任何内容不匹配: 魔法文件中的条目,它是 检查它是否是一个 文本文件。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,这将是 报道。包含嵌入 逃逸序列或过度起跳将 也可以确定


某些字节序列表明可能正在使用UTF-8编码(请参阅)。如果
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编写文件。

它将在文件的最开头插入BOM表

BOM(字节顺序标记)告诉编辑器文件的编码(以及其他类似于大/小尾端编码的内容)

通过检查文件大小,可以发现BOM表是否存在。它超过2个字节(我猜是4或5个字节)

在维基百科中,这会有很大帮助


更新: 是的,我错了

即使UTF-8也有BOM,但大多数编辑器在开始时都不插入BOM,因为BOM代码是ASCII不兼容的,UTF-8设计的目标之一是ASCII兼容。所以为UTF-8插入BOM真的很糟糕

因此,编辑器确实可以猜测文件是否以UTF-8编码


那又是一个问题!:

似乎有可能编辑对文件的真实编码猜错了。这种情况罕见吗?很明显,较小的文本更容易出现这种情况。

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。

对。谢谢这就是我想要了解的部分:“[utf-8]可以通过构成可打印文本的不同字节范围和序列来区分”,它们的具体区别是什么?@DervinThunk:检查.bom是否被普遍使用,如果它们不存在,你所能做的就是猜测。特别是,echo“å”>test.txt可能不会在文件中插入BOM,因为echo不是为创建文件而设计的。Artelius是对的。事实上,除MSV外,BOM很少使用。在任何情况下,如果I hextump,仍然没有BOM:c3a50a(0a是段落标记)…猜测文本的编码并不简单。它需要统计分析。尤其是当您的文件只包含一个字符时,这几乎是不可能的!检查文件大小以查看是否存在BOM表;)编码为UTF-8的BOM是三个字节。但是bom通常不应该在UTF-8文件中使用,因为它们没有意义并且不兼容ASCII。不幸的是,某些Microsoft软件确实将它们放入了其中。您可能需要注意短语“对于基本ASCII字符集,二进制表示在所有编码中都是相同的”。抛开EBCDIC等旧的备用字符不谈,这些基本的ASCII字符在UTF-16或UTF-32中不再那么基本了。