文字エンコーディングが破損したWebサイトから一部のデータを抽出するスクリプトを作成しています。
- htmlヘッダーはiso-8859-1と主張しますが、そうではありません。
wget
ファイルを調べると、実際にはutf-8ですが、間違った文字があることを示しています。- リバースエンジニアリングにより、誰かがWindowsコードページ1252をUnicodeコードとして使用したことがわかります。
たとえば、バックティックはコードページ1252では0x91、このページではU + 0091です。奇妙な。驚くべきことに、Webブラウザはこの問題を自動的に解決できるようです。
私の質問:この混乱をきれいにするのにどのようなツールが役に立ちますか? (手で作成したものではありません。このウェブサイトは数百ページの動的ウェブサイトであり、少なくとも6つ以上の異なる誤ったエンコードを見ました。)
答え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はうまく機能します。たとえば、入力データがISO-8859の場合でも、UTF-8でエンコードされたことをiconvに指示して、iconvが入力がUTF-8のように動作するようにすることができます。これにより、誤ってエンコードされたデータを修正できます。
iconvはフィルタとして使用できるため、同じものと一緒に使用できます。 Link withはcurl
使用時にもwget
機能します--output-document -
。
私が知っている限り、iconvは正しい入力エンコーディングを検出/推測できません。ただし、入力データがどれほど汚れているかに応じて、サイトにさまざまな種類のエラー/混合エンコードがある場合、これは「不可能」になる可能性があります。サイト全体が同じように混乱している場合は、それを修正できます。
答え2
locale
まずUTF-8を使用する必要があります。
発覚
chardetect
(python3-chardetパッケージでは、別名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