壊れたファイルで二重文字を見つけてUnicode単一文字に置き換えるには?

壊れたファイルで二重文字を見つけてUnicode単一文字に置き換えるには?

整理する必要がある長いフランス語のテキストファイルがあります。非ASCII文字は奇数文字の組み合わせに置き換えられました。たとえば、次のようになります。

誕生日おめでとうございます。

次のようにする必要があります。 (Unicodeテキストで)

通り過ぎる方々 幸せな年末をお過ごしください。

sedを試しましたが、成功しませんでした。友人がPerlを試してみることをお勧めしました。奇妙な文字シーケンスと正しい代替文字を含むテーブルを簡単に作成できます。理想的には、後で使用できるようにテーブルをスタンドアロンファイルにしたいと思います。このタイプの移行に推奨されるアプローチは何ですか?

答え1

テキストがutf-8(Unix標準なので大丈夫)でエンコードされているように見えますが、何かがISO 8859-1 / MicrosoftのWindows Latin-1に読み込まれ、対応する解釈が出力されます。これを裏返す必要があります。

例えば

echo "passer de très bonnes fêtes de fin d'année" | iconv --to-code="ISO 8859-1"

これにより、壊れたエンコーディングが有効なUTF-8に変換されます。システムがutf-8で構成されている場合は、正しく読み取られます。

説明:これにより、echo è | od -t x116echo ê | od -t x1進コードがc3 a8 0a合計であることがわかり、ここを見るc3 aa 0aことができます。http://www.ascii-code.com/(これはASCIIではなくISO 8859-1コードです。)私たちは、このコードがè後ろêに見えない文字が来るのを見ることができます。今、私たちは何が間違っているのか知っています。 UTF-8を読みますが、ISO 8859-1として解釈することです。したがって、これを裏返す必要があります。読んでいる形式が何であれ、それをISO 8859-1(ここにあるものとは逆)に変換する必要があります。結果は有効なutf-8です。

答え2

元のポスターが提示するモジバケには2つの理由があります。

  1. ファイルにはUTF形式のフランス語のテキストが含まれていますが、ファイルを誤って表示するプログラムはUTF-8の代わりにISO 8859-1またはWindows-1252エンコーディングを使用します。
  2. デュアルエンコーディング:基本的にリチャードが言ったことです。

解決策は次のとおりです。

  1. UTF-8ロケールを使用するアプリケーションから読み込みます。
  2. 努力するiconf -f UTF-8 -t Windows-1252 <ジャンクファイル          またはiconf -f UTF-8 -t ISO-8859-1 <ジャンクファイル      、出力に意味のあるUTF-8テキストがあると予想されます。

ただし、テキストがより破損している可能性があります(専門家の場合:例:UTFでエンコードされたU + 00C7Ç \303\207、ISO-8859-1のC1制御コードで読み取りが削除される)、自動変換はもはや不可能です。その場合は、自動検索と置換(Richardの回答の下の説明を参照)を使用して、少なくともいくつかの元の文字を復元できます。

関連情報