我正在构建一个脚本来从具有损坏字符编码的网站中提取一些数据:
- html 标头声称它是 iso-8859-1,但事实并非如此
wget
检查文件显示它实际上是 utf-8,但字符错误- 逆向工程显示有人设法使用 Windows 代码页 1252 作为 unicode 代码!
例如,反引号在代码页 1252 中为 0x91,在本页中为 U+0091。诡异的。令人惊讶的是,网络浏览器似乎能够自动修复此问题。
我的问题:哪个工具可以帮助我清理这个烂摊子? (不是手工!这是一个拥有数百个页面的动态网站,我看到至少六种不同的错误编码。)
答案1
根据您对“不是手工”的意思,iconv
可能对您的任务有用。
iconv - 将文本从一种字符编码转换为另一种字符编码
选项
-f from-encoding, --from-code=from-encoding Use from-encoding for input characters. -t to-encoding, --to-code=to-encoding Use to-encoding for output characters.
根据我的经验,即使您必须处理错误的编码, iconv 也能正常工作。例如,您可以告诉 iconv 输入数据是 utf-8 编码的,即使它是 iso-8859,以便 iconv 的行为就像输入是 utf-8 一样。这样您就可以修复编码错误的数据。
由于 iconv 可以用作过滤器,因此您可以将其与类似curl
.当您使用 时,链接 withwget
也应该有效--output-document -
。
据我所知, iconv 无法检测/猜测正确的输入编码。但是,根据您的输入数据的混乱程度,如果网站有(太多)不同类型的错误/混合编码,这可能是“不可能的”。如果整个网站都以同样的方式混乱,您应该能够修复它。
答案2
首先,您需要locale
使用 UTF-8。
检测
chardetect
(来自 python3-chardet 包;AKA chardet)uchardet
,编码检测器库(现在在 freedesktop 上)enca
,专注于东欧和中欧语言-
file --brief --mime-encoding FILE | awk '{print $2}' FS=':[ :]+'
通常的嫌疑人是:CP850、CP437、latin1(又名 ISO-8859-1)、CP1252(又名 windows-1252)。
根据我的经验,这些工具通常无法完成这项工作。有时,一个文件可能会混合使用多种编码。
我在某个地方发现了这个蛮力方便的小脚本:
#!/bin/bash
# Usage string-encoding-detector.sh fileWithLiberaci°n.txt | grep Liberación
iconv --list | sed -e 's/\/\///g' | while read -r encoding
do
transcoded=$(head -n1 "$1" | iconv -c -f "$encoding" -t UTF-8)
echo "$encoding $transcoded"
done