UTF-8和ISO8859-1文件的区别

3
目前我有一个程序,旨在模仿(Linux)文件命令的功能。我解析了一个带有一些字符的.txt文件,并将其解释为相应的解释。然而,当涉及到ISO8859-1(Latin 1)时,我很难区分文件。因为它将ISO8859-1字符转换为UTF-8编码(例如æ = e6,编码为c3 b8?)。 当我制作并传递这个.txt文件给文件命令时:
printf "æøå" > test.txt

file test.txt

它简单地返回:

UTF-8 Unicode文本,没有行终止符。

* od -c -tx1 test.txt :返回 *

0000000 303 246 303 270 303 245
         c3  a6  c3  b8  c3  a5
0000006

有人能解释一下为什么会出现这种情况吗?因为“æøå”前缀包含在ISO8859-1编码中,但却被解释为UTF8编码。


请编辑您的问题并显示od -c -tx1 test.txt的输出,以确保文件确实包含预期的十六进制值。顺便说一句:虽然您可能想在C中实现某些内容,但您的问题与C无关,因为它仅涉及一些shell命令。 - Bodo
@Bodo,我纠正了问题并显示了运行命令时的输出。它有意义,因为它会解释这些值为2字节,然后将其转换为UTF8。然而,对我来说这很奇怪,因为ISO8859-1标准包括æøå在160-255的范围内。 - NewDev90
你不清楚在这个问题中哪里让你感到奇怪了。如果你的终端编码是UTF-8,难道你不希望文件以UTF-8格式创建吗?你期望在什么时候涉及到ISO8859-1呢? - user694733
2个回答

4

显然,您的文件采用UTF-8编码。例如,c3 a6æ 的UTF-8编码。

可能您的系统语言环境设置为UTF-8。您可以通过运行locale命令来检查此设置。

要将文件从UTF-8转换为ISO8859-1,您可以使用以下命令:

recode utf8..iso8859-1 test.txt 

完成此操作后,您将会得到:

$ od -c -tx1 test.txt            
0000000 346 370 345
         e6  f8  e5
0000003

正如R..指出的那样,如果尚未安装,则可能需要安装recode。 您还可以使用iconv,但此工具无法进行就地修改。 参见在字符集之间转换文本文件的最佳方法是什么?https:// unix.stackexchange.com / q / 10241/330217


谢谢,那可能就是我错过的东西 :-) 我不知道有关于recode命令的信息! - NewDev90
iconv 命令是标准的方法来进行此操作。recode 是一个随机的实用程序,可能已安装或未安装。 - R.. GitHub STOP HELPING ICE

2
Bodo的回答是正确的,但我认为你问题的根源在于“字符集”一词的歧义。你是正确的,ISO-8859-1中所有这些字符都是可用的字符集合中的字符,但这并不是非常相关的。这意味着当使用ISO-8859-1编码文本时,你可以忠实地表示它们。现代用法中,“编码字符集”或更好地称为“字符编码”反映了重要方面,即可用字符集中的抽象字符如何映射到存储表示形式。
作为集合,ISO-8859-1是Unicode的子集,因此是UTF-8可表示字符集的子集。但是,作为编码方式,它们除了ASCII子集之外其他任何字符在UTF-8和ISO-8859-1中都没有相同的表示方式。如果不是这种情况,则无法表示超过256个字符,因为在ISO-8859-1中,所有256个字节的含义都已分配(给单个字符)。
正如Bodo所指出的,æ在UTF-8中被编码为,而在ISO-8859-1中被编码为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接