文字エンコード混乱の問題を修正

文字エンコード混乱の問題を修正

文字エンコーディングが破損した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

切り替える

関連

関連情報