目前,我有一个程序,它试图模仿(linux)文件命令的功能。我解析带有一些字符的.txt文件,并将其解释为各自的解释。然而,当涉及到I 8859-1(拉丁文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有人能向我解释为什么会出现这种情况,因为‘UTF8’前缀包含在ISO8859-1编码中,然后被解释为编码吗?
发布于 2019-09-17 08:16:29
显然,您的文件包含UTF-8编码。例如,c3 a6是æ的UTF-8编码。
可能您的系统区域设置为UTF-8。您可以通过运行locale命令来检查这一点。
若要将文件从UTF-8转换为use 8859-1,可以使用
recode utf8..iso8859-1 test.txt 在这之后你会得到
$ od -c -tx1 test.txt
0000000 346 370 345
e6 f8 e5
0000003正如R..所指出的,如果recode尚未安装,则可能必须安装它。您也可以使用iconv,但是这个工具不能进行就地修改.另见Best way to convert text files between character sets?和https://unix.stackexchange.com/q/10241/330217
发布于 2019-09-17 12:36:13
博多的回答是正确的,但我认为你问题的根源在于“字符集”这个词的模糊性。所有这些字符都在ISO-8859-1中可用的字符集中,这是正确的,但这并不十分相关;这意味着,当将文本编码为ISO-8859-1时,您可以忠实地表示它们。" set“一词的歧义(有些甚至可以说是误用)就是为什么在现代用法中,这一概念被称为”编码字符集“,或者最好称为”字符编码“,以反映重要的方面是可用字符集合中的抽象字符如何映射到存储的表示形式。
作为集合,ISO-8859-1是Unicode的子集,因此是由UTF-8表示的字符集的子集。但是作为编码,除了ASCII的子集之外,它们在任何地方都不同意。ISO-8859-1中的所有其他字符在UTF-8中的表示方式与在ISO-8859-1中的表示方式不同;如果不是这样的话,就无法表示超过256个字符,因为在ISO-8859-1中,所有256个字节的含义都分配给了(单个字符)。
正如Bodo的答案所指出的,在UTF-8中编码为c3 a6,而在ISO-8859-1中编码为e6。
https://stackoverflow.com/questions/57969732
复制相似问题