当我尝试使用以下方法了解文件 all.txt 的编码时
$ file all.txt
它显示此消息
all.txt: Non-ISO extended-ASCII text, with very long lines
这种编码的非 ISO 扩展 ASCII 文本是什么类型的?
因为我需要将其转换为另一种编码,所以我需要知道这个文件的编码
有什么帮助吗?
答案1
它看起来既不像 utf-8 也不像 iso-8859-1。它可能是其他任何东西。它甚至可能根本不是文本。这种类型是对任何不包含零字节的内容的一种后备描述。
即使它实际上是一个文本文件(扩展名表明它可能是一个文本文件),遗憾的是没有自动找出编码的方法,因为大多数编码具有相同的有效代码范围。Utf-8 可以非常有把握地区分开来,但除此之外,它需要手动检查。
首先,您必须找出文件使用的语言,以便了解哪些内容是正确的,哪些内容是乱码,并列出可能的编码。因为编码有无数种,但只有少数几种用于特定语言。
然后您需要尝试从每种可能的编码转换文件,并且对于技术上成功的每次转换(不幸的是大多数都是如此)查看结果并检查它是否正确。
拼写检查器可能会帮助您进行审核,因为不正确的转换会导致更多的拼写检查器错误。
对于转换,您可以使用iconv
(1),从 GNU/Linux 上的 libc 包安装或recode
.recode
有更多选项和更好的错误处理。
答案2
这不适合写评论,所以这里是:我手上也有一个奇怪的文件:
$ 文件系统信息.txt systeminfo.txt:非 ISO 扩展 ASCII 文本
我知道这是由德国 WindowsXP 安装生成的,并且包含一些变音符号但iconv
无法将其转换为合理的内容:
$ iconv -t UTF-8 系统信息.txt > 系统信息_utf8.txt iconv:位置 308 处的输入序列非法
但由于iconv
知道很多编码,我使用蛮力方法找到了一个有效的来源编码:
$ iconv --list | sed 's/\/\/$//' | sort > encodings.list $ for a in `cat encodings.list`; 执行 打印“$a” iconv -f $a -t UTF-8 系统信息.txt > /dev/null 2>&1 \ && 回显“ok:$a”||回显“失败:$a” 完成 | tee 结果.txt
然后我会仔细result.txt
寻找没有失败。就我而言,-f CP850 -t UTF-8
一切正常,但变音符号仍然存在,只不过现在以 UTF-8 编码了 :-)
答案3
我把 ckujau 的脚本缩短如下:
#!/bin/bash
iconv --list | sed -e 's/\/\///g' | while read encoding
do
transcoded=$(head -n1 strange-encoding.txt | iconv -sc -f $encoding -t UTF-8)
echo "$encoding $transcoded"
done
因此,当我有一个带有未知字符编码的文件时:
$ cat strange-encoding.txt
B�rbel
我希望这是德国女性的名字“Bärbel”,我可以找出所有匹配的编码
$ ./check_encodings.sh | grep "Bärbel"
437 Bärbel
850 Bärbel
851 Bärbel
852 Bärbel
857 Bärbel
861 Bärbel
865 Bärbel
CP-HU Bärbel
CP437 Bärbel
CP770 Bärbel
CP773 Bärbel
CP774 Bärbel
CP775 Bärbel
CP850 Bärbel
CP851 Bärbel
CP852 Bärbel
CP857 Bärbel
CP861 Bärbel
CP865 Bärbel
CPIBM861 Bärbel
CSIBM851 Bärbel
CSIBM857 Bärbel
CSIBM865 Bärbel
CSPC8CODEPAGE437 Bärbel
CSPC775BALTIC Bärbel
CSPC850MULTILINGUAL Bärbel
CSPCP852 Bärbel
CWI-2 Bärbel
CWI Bärbel
IBM437 Bärbel
IBM775 Bärbel
IBM850 Bärbel
IBM851 Bärbel
IBM852 Bärbel
IBM857 Bärbel
IBM861 Bärbel
IBM865 Bärbel
OSF100201B5 Bärbel
感谢ckujau!