如何重新编码混合编码的文本文件

如何重新编码混合编码的文本文件

我有一个 ASCII 日志文件,除了一些 UTF-8 字符(我可以在未来版本中修复)。

目前,我需要弄清楚如何通过 gedit/less 等将此文件置于可查看/可搜索/可编辑状态。

enca -L none file返回7bit ASCII characters Surrounded by/intermixed with non-text data

enconv -L none -X ASCII fileenconv -L none -X UTF-8 file“成功”,但实际上并没有改变任何东西。

我该如何修复这个文件?

更新(在一些答案之后):

实际上,如下所述(所有人都赞成:)),ASCII + UTF-8 就是 UTF-8。我拥有的是

0003bbc0  28 4c 6f 61 64 65 72 29  20 50 61 74 69 65 6e 74  |(Loader) Patient|
0003bbd0  20 00 5a 00 5a 00 5a 00  38 00 31 00 30 00 34 00  | .Z.Z.Z.8.1.0.4.|
0003bbe0  20 6e 6f 74 20 66 6f 75  6e 64 20 69 6e 20 64 61  | not found in da|
0003bbf0  74 61 62 61 73 65 0d 0a  32 36 20 53 65 70 20 32  |tabase..26 Sep 2|

我相信这将是cp1252 类型的编码实际上,我不知道它是什么,cp1252 将是 ASCII 的 1 字节,不是吗?

顺便说一句,事实上 linux barfs 帮助我发现输入文件(id 的来源)编码错误......

答案1

一个“ASCII,除了一些 UTF-8 字符”的文件就是一个 UTF-8 文件。

只要您使用 UTF-8 语言环境,它就可以查看/搜索/编辑。

您无法将其转换为 ascii,因为后者没有 UTF-8 特殊字符的等效表示。

您可能想转换为 Isolatin

iconv -f UTF-8 -t ISO-8859-1

答案2

你所拥有的实际上是 ASCII(通常的 8 位字节编码),带有一些UCS-2(Unicode 仅限于基本平面 (BMP),其中每个字符被编码为两个 8 位字节),或者也许UTF-16(UCS-2 的扩展,可以通过对 U+D7FF 以上的代码点使用多字编码来对所有 Unicode 进行编码)。

我怀疑您是否会找到一种可以立即处理这种邪恶混合物的工具。没有办法完全通用地解码该文件。就您而言,可能发生的情况是某些 ASCII 数据在某个时候被编码为 UTF-16(Windows 和 Java 喜欢 UTF-16;它们在 Unix 世界中几乎闻所未闻)。如果您假设原始数据都是 ASCII,则可以通过删除所有空字节来恢复可用的文件。

<bizarre tr -d '\000' >ascii

答案3

如果您的文件包含带有一些 UTF-8 字符的 ASCII,那么根据定义,它就是 UTF-8 文件。纯 ASCII 文件也是有效的 UTF-8。

听起来您所拥有的是 ASCII、UTF-8 和其他一些单字节编码(如 Latin-1)的混合。那就很难清理了但如果不知道文件实际包含的内容,就很难给出好的建议。尝试发布hexdump -C file(将其缩减为包含问题字符的几行)的输出。

答案4

chardet从包中尝试python-chardet- 我刚刚在一个enca无法识别的文件上尝试过...chardet检测到字符集类型。 (根据手册页,恩卡代表极其简单的字符集分析 :)

如果您无法检测类型,那么重新编码是相当徒劳的,因为重新编码器需要知道输入格式(请参阅检测字符集, 以下)

您可以尝试在另一个文本编辑器中打开该文件,例如。emacsvimjedit, ETC。

gedit在文件打开对话框中有一个选择/添加/删除选项。您可以选择/添加字符集到字符集列表(一旦您知道它是什么)。gedit仅打开该列表中显示的类型。

此外,它可能是一个文字处理器文件。尝试使用 OpenOffice.org 打开它。

另一个(绝望(?)选项,是用户strings.
strings将打印文件中可打印字符串。


检测字符集充满了问题。为了许多基于拉丁文字的语言(你的似乎是),有许多字符集变化。这些字符集的唯一共同主题是基线 7 位 ASCII 字符集,它由十六进制 \x00 到 \x7F 的 128 种可能性组成。

任何一个许多使用第 8 位(另外 128 个字母)的单字节字符集使用此上限有多少种不同的字符集,就有多少种不同的方式。

除非你知道编码是什么,检测它通常是一个统计概率游戏(逆向工程),因为检测程序不知道编码是什么它正在看着;它只看到字节值。当没有检测到唯一定义的差异时(这不是一个简单的任务),那么唯一的方法是选择最常用的匹配字符集。

最重要的是,即使文件包含完全有效的字符集 A,它对于检测程序来说也与字符集 B 一样有效......这就是为什么需要知道字符编码! -- 特别是对于仅使用单字节的字符集。

多字节字符集有更明显的指纹,但即便如此,如果样本集不够大,这又是一场猜谜游戏……

相关内容