我有一个 ASCII 日志文件,除了一些 UTF-8 字符(我可以在未来版本中修复)。
目前,我需要弄清楚如何通过 gedit/less 等将此文件置于可查看/可搜索/可编辑状态。
enca -L none file
返回7bit ASCII characters Surrounded by/intermixed with non-text data
。
enconv -L none -X ASCII file
和enconv -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
检测到字符集类型。 (根据手册页,恩卡代表极其简单的字符集分析 :)
如果您无法检测类型,那么重新编码是相当徒劳的,因为重新编码器需要知道输入格式(请参阅检测字符集, 以下)
您可以尝试在另一个文本编辑器中打开该文件,例如。emacs
,vim
,jedit
, ETC。
gedit
在文件打开对话框中有一个选择/添加/删除选项。您可以选择/添加字符集到字符集列表(一旦您知道它是什么)。gedit
仅打开该列表中显示的类型。
此外,它可能是一个文字处理器文件。尝试使用 OpenOffice.org 打开它。
另一个(绝望(?)选项,是用户strings
.
strings
将打印文件中可打印字符串。
检测字符集充满了问题。为了许多基于拉丁文字的语言(你的似乎是),有许多字符集变化。这些字符集的唯一共同主题是基线 7 位 ASCII 字符集,它由十六进制 \x00 到 \x7F 的 128 种可能性组成。
任何一个许多使用第 8 位(另外 128 个字母)的单字节字符集使用此上限有多少种不同的字符集,就有多少种不同的方式。
除非你知道编码是什么,检测它通常是一个统计概率游戏(逆向工程),因为检测程序不知道编码是什么信它正在看着;它只看到字节值。当没有检测到唯一定义的差异时(这不是一个简单的任务),那么唯一的方法是选择最常用的匹配字符集。
最重要的是,即使文件包含完全有效的字符集 A,它对于检测程序来说也与字符集 B 一样有效......这就是为什么需要知道字符编码! -- 特别是对于仅使用单字节的字符集。
多字节字符集有更明显的指纹,但即便如此,如果样本集不够大,这又是一场猜谜游戏……