GNU/Linux >> Linux の 問題 >  >> Linux

条件付きでUTF-8に再コード化する方法は?

このメッセージはかなり古いですが、私はこの問題に貢献できると思います:
最初に recodeifneeded という名前のスクリプトを作成します :

#!/bin/bash
# Find the current encoding of the file
encoding=$(file -i "$2" | sed "s/.*charset=\(.*\)$/\1/")

if [ ! "$1" == "${encoding}" ]
then
# Encodings differ, we have to encode
echo "recoding from ${encoding} to $1 file : $2"
recode ${encoding}..$1 $2
fi

このように使用できます:

recodeifneeded utf-8 file.txt

したがって、再帰的に実行し、すべての *.txt ファイルのエンコーディングを (たとえば) utf-8 に変更したい場合:

find . -name "*.txt" -exec recodeifneeded utf-8 {} \;

これがお役に立てば幸いです。


このスクリプトは、(特定の UTF-8 でエンコードされたスカンジナビア文字の存在に基づいて) 1 つのファイルを条件付きで再コード化する harrymc のアイデアから採用されており、私にとってはかなりうまく機能しているようです。

$ cat recode-to-utf8.sh 

#!/bin/sh
# Recodes specified file to UTF-8, except if it seems to be UTF-8 already

result=`grep -c [åäöÅÄÖ] $1` 
if [ "$result" -eq "0" ]
then
    echo "Recoding $1 from ISO-8859-1 to UTF-8"
    recode ISO-8859-1..UTF-8 $1 # overwrites file
else
    echo "$1 was already UTF-8 (probably); skipping it"
fi

(ファイルのバッチ処理は、もちろん for f in *txt; do recode-to-utf8.sh $f; done などの単純な問題です .)

注意 :これは、スクリプト ファイル自体が UTF-8 であることに完全に依存します。これは明らかに、私がたまたま持っているファイルの種類に適した非常に限定的なソリューションであるため、より良い回答を自由に追加してください より一般的な方法で問題を解決します。


UTF-8 には、有効なバイト シーケンスに関する厳密な規則があります。これは、データが できた UTF-8 であるため、 であると仮定すると、誤検知が発生することはほとんどありません。 .

したがって、次のようなことができます (Python で):

def convert_to_utf8(data):
    try:
        data.decode('UTF-8')
        return data  # was already UTF-8
    except UnicodeError:
        return data.decode('ISO-8859-1').encode('UTF-8')

シェルスクリプトでは、 iconv を使用できます 変換を実行するには、UTF-8 を検出する手段が必要です。 1 つの方法は iconv を使用することです ソースと宛先の両方のエンコーディングとして UTF-8 を使用します。ファイルが有効な UTF-8 であった場合、出力は入力と同じになります。


Linux
  1. LinuxでファイルをUTF-8エンコーディングに変換する方法

  2. Utf-8ファイルからBOMを削除する方法は?

  3. Linuxでファイルの名前を変更するにはどうすればよいですか?

  1. ファイルをスパースにする方法は?

  2. ファイル内で \n を grep する方法

  3. BashでファイルにUTF-8 BOMがあるかどうかを検出する方法は?

  1. Linuxファイル機能を管理する方法

  2. ファイルをその場でソートする方法

  3. ファイルをトランザクション的にコピーする方法は?