使用 iconv 和文件 - 如何更改不正确的字符编码设置?

使用 iconv 和文件 - 如何更改不正确的字符编码设置?

我有一个文件夹,里面装满了 ASCII 文本文件,这些文件的文件信息设置得让 Mac 上的文本编辑器认为它们是土耳其语。文件夹中的原始注释声称它是 Windows Latin 1(土耳其语是 5),所以我认为文件上的信息完全不正确。当我在 Windows 上或在 Mac 上的浏览​​器中打开文件时,它显示正常。

我了解到这file会揭示有关类型的信息,因此我尝试了一下并得到:

banka0.txt: application/octet-stream; charset=binary

当我在具有打开属性的文件上尝试此操作时,我得到:

ex3.nec: text/plain; charset=us-ascii

那么这些不正确的数据在哪里?我该如何更改它?

在网上搜索了一下,建议的iconv解决方案是。但是,这似乎转换了文件内的实际文本,我不认为这是问题所在,而是元数据错误。我还是试了一下,但没有成功:

iconv -t ascii < BANKA0 > BANKA0.ASCII

其结果是:

iconv: (stdin):1:0: cannot convert

我还尝试了 UTF-8 和其他一些编码方式,都返回了相同的结果。

更新:文件开头的一些十六进制:

00000000  fe fe a1 39 01 00 13 58  3b 53 41 56 45 20 23 44  |...9...X;SAVE #D|
00000010  3a 42 41 4e 4b 41 30 e8  03 3d 06 41 b6 42 41 53  |:BANKA0..=.A.BAS|
00000020  49 43 20 58 4c 20 43 41  52 54 52 49 44 47 45 20  |IC XL CARTRIDGE |
00000030  20 28 43 29 20 31 39 38  34 20 4f 53 53 2c 20 49  | (C) 1984 OSS, I|
00000040  4e 43 2e 20 20 20 20 20  20 20 20 20 20 20 42 41  |NC.           BA|
00000050  4e 4b 31 41 f2 03 05 58  3b fc 03 28 58 3b 20 20  |NK1A...X;..(X;  |
00000060  20 20 20 20 20 50 52 45  41 44 59 20 2d 20 50 52  |     PREADY - PR|
00000070  49 4e 54 20 52 45 41 44  59 20 4d 45 53 53 41 47  |INT READY MESSAG|
00000080  45 06 04 05 58 3b 10 04  0a 86 50 52 45 41 44 59  |E...X;....PREADY|
00000090  1a 04 0b 24 3e 34 84 52  4d 53 47 24 04 0b 25 3e  |...$>4.RMSG$..%>|

答案1

没有这样的设置。

一般来说,file不会“透露”任何外部元数据——它只会尝试探测文件类型和一些常见的文本编码。它通过猜测(它带有一个包含不同特征的大型数据库)来实现这一点,并且一些编码(例如 UTF-8 和 US-ASCII)具有可以可靠检测的不同特征,但许多其他编码在计算机看来是相同的。

例如,所有 ISO-8859-x 字符集看起来都很相似 - 它们都是使用相同字节范围的单字节编码,只是将它们映射到不同的字符。如果您有一个包含土耳其语文本的 ISO-8859-9(又名 Latin-5)文件,该file工具仍会认为它是 ISO-8859-1(又名 Latin-1),实际上任何程序都可以解码将其作为 ISO-8859-1 – 字母确实是错误的,但解码器无法知道这一点。

这同样适用于 Windows-125x 字符集、IBM 字符集以及最有可能的 MacOS 代码页。

简而言之,没有可以设置的文件属性(至少 Windows 和 macOS 都无法理解)来表示“此 .txt 文件使用 Latin-5”。就像该file工具一样,您的文本编辑器会尝试猜测正确的编码 - 通常在 Windows 上,它们首先尝试 UTF-8,然后返回到适合当前 Windows“区域设置”的任何编码。

(该chardetect工具可以进行更深入的频率分析,但即便如此,它也无法完全区分某些代码页,例如,即使是大量的 ISO-8859-9 文本样本对该工具来说仍然看起来像“置信度为 0.72 的 ISO-8859-1”。)

此外,这些字符集几乎都是 ASCII 的严格超集,而 ASCII 本身只能表示英语/拉丁字母。将文件转换为 ASCII 毫无意义——这意味着扔掉所有不正确的字符,因为它们都不能用纯 ASCII 表示。通常,您需要采取另一种方法,将文件转换为最多可用的字符集 — — 通常为使用 Unicodeutf8编码。

因此,如果您认为文本文件是 Latin-5 (ISO-8859-9),请告诉 iconv 进行转换转换为 UTF-8:

iconv -f iso8859-9 -t utf8 < BANKA0 > BANKA0.NEW

然而,MacOS 可能使用了不同的代码页 - “MacTurkish”或“IBM1281”(我在 GNU iconv 中找不到,但它可能在 macOS 本身上受支持)。

(其他文件类型,如 HTML,支持嵌入元数据,并且可以指定其字符集之内文件本身 - 但 .txt 文件没有约定的嵌入元数据格式,整个文件只是文本。)

相关内容