web-dev-qa-db-ja.com

CRLF行ターミネーターを使用して、エンコーディングを非ISO拡張ASCIIテキストからUTF-8に変更するにはどうすればよいですか?

私はtxtファイルを持っています:

$ file -i x.txt
x.txt: text/plain; charset=unknown-8bit
$ file x.txt 
x.txt: Non-ISO extended-ASCII text, with CRLF line terminators

そして、正しくエンコードされていない文字がいくつかあります:

trwa³y, sta³y, usuwaæ

このファイルのエンコーディングをUTF-8に変更するにはどうすればよいですか?これまでに次の方法を試しました:

$ iconv -f ASCII -t UTF-8 x.txt
                puiconv: illegal input sequence at position 4

たぶん私はどういうわけかextended ASCIIhigh ASCII)を使用するべきですが、iconvのエンコーディングリストでそれを見つけることができません。

22
Patryk

fileは、次のことを検出するため、「非ISO拡張ASCIIテキスト」を通知します。

  • おそらく、改行以外の制御文字(バイト値0〜31)の欠如による「テキスト」ファイル。
  • 「extended-ASCII」は、ASCIIの範囲外の文字があるためです(バイト値≥128)。
  • 128〜159の範囲の文字があるため、「非ISO」( ISO 8859 はこの範囲を制御文字用に予約しています)。

このファイルがどのエンコーディングにあると思われるかを把握する必要があります。 Enca の自動認識を試すことができます。テキストがどの言語であるかを伝えることで、正しい方向に微調整する必要がある場合があります。

enca x.txt
enca -L polish x.txt

ファイルを変換するには、-xオプションを渡してください:enca -L polish x.txt -x utf8 >x.utf8.txt

Encaを使用できない場合、または使用したくない場合は、手動でエンコーディングを推測できます。少し見回すと、これはポーランド語のテキストであり、単語はtrwały、stały、usuważであるため、³łおよびæżの翻訳を探しています。これは latin-2 または latin-1 またはより可能性が高い(「非ISO」の場合) CP125 として表示- latin1 。ファイルをUTF-8に変換するには、 recode または iconv を使用できます。

recode CP1250..utf8 <x.txt >x.utf8.txt
iconv -f CP1250 -t UTF-8 <x.txt >x.utf8.txt

Geditでテキストファイルを開き、[名前を付けて保存]ダイアログで現在のエンコーディングを確認します。

1
gedit

X.txtの正確なエンコーディングを見つけようとしましたか?サポートされているエンコーディングのリストが表示されます

iconv --list

Latin1とutf8の不一致が発生することがあります。次に、utf8への変換とutf8への変換、およびその逆の変換が役立つことがよくあります。

0
user55518

enca ライブラリを使用して自動化された 変換スクリプト を作成しました。これをmy NASで使用して字幕をUTF-8に変換しますが、自動変換に利用できます

自由に使ってください:)

編集:

#!/bin/bash
LANGUAGE=czech
TO=utf8
CONVERT="enca -L $LANGUAGE -x $TO"

# Find and onvert
find ./ -type f -name "*.srt" | while read fn; do
  IS_TARGET=`enca "${fn}" | egrep -ow -m 1 'UTF-8|Unrecognized|KOI8-CS2|7bit ASCII|UCS-2|Macintosh Central European'`

    if [ "$IS_TARGET" != "UTF-8" ] &&
       [ "$IS_TARGET" != "UCS-2" ] &&
       [ "$IS_TARGET" != "Macintosh Central European" ] &&
       [ "$IS_TARGET" != "Unrecognized" ] &&
       [ "$IS_TARGET" != "7bit ASCII" ] &&
       [ "$IS_TARGET" != "KOI8-CS2" ]; then

        echo "${fn} ---- Will be converted!"
    # optional backup of original srt
        # cp "${fn}" "${fn}.bak"
        $CONVERT "${fn}"
    fi  

done
0
Barlog951