エンコード用にファイルをバッチ変換する


46

コマンドまたはツールを使用して、エンコード(たとえばANSI-> UTF-8)のためにディレクトリ内のファイルをバッチ変換するにはどうすればよいですか?

単一ファイルの場合、エディターが役立ちますが、大量ファイルのジョブを実行するにはどうすればよいですか?



回答:


36

CygwinまたはGnuWin32iconv、and dos2unix(およびunix2dos)のようなUnixツールを提供します。Unix / Linux / Cygwinでは、ANSIの代わりに「windows-1252」をエンコードとして使用する必要があります(以下を参照)。(システムがデフォルトのコードページとして1252以外のコードページを使用していることがわかっている場合を除き、この場合、変換元の正しいコードページをiconvに伝える必要があります。)

以下を使用して、一方(-f)から他方()に変換-tします。

$ iconv -f windows-1252 -t utf-8 infile > outfile

または、すべてを征服する形式で:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 {} \> {} \;

代わりに:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 -o {} {} \;

この質問はこのサイトで何度も聞かれているので、「ANSI」に関する追加情報があります。関連する質問への回答で、CesarBは次のように述べています

Windowsには「ANSI」と呼ばれるいくつかのエンコーディングがあります。実際、 ANSIは誤った呼び名です。iconvには、必要なものを推測する方法はありません。

ANSIエンコーディングは、Windows APIの「A」関数で使用されるエンコーディングです(「W」関数はUTF-16を使用します)。通常、どのエンコーディングに対応するかは、Windowsシステム言語によって異なります。最も一般的なのはCP 1252(Windows-1252とも呼ばれます)です。したがって、エディターがANSIと言うとき、それは「API関数がデフォルトのANSIエンコーディングとして使用するものは何でも」を意味します。

彼がリンクしているページは、CP 1252とISO-8859-1の起源に関するこの歴史的な情報(Microsoft PDFから引用)を提供しています。

[...]これは、Windowsコードページ1252がもともとISO標準8859-1になったANSIドラフトに基づいていたという事実に由来しています。ただし、ISO標準の制御コード用に予約されている範囲にコードポイントを追加する場合、Windowsコードページ1252およびISO 8859-xシリーズに元々基づいている後続のWindowsコードページはISOから逸脱していました。今日まで、Microsoft内外の開発コミュニティが8859-1コードページをWindows 1252と混同し、Windowsコードページサポートを示すために使用される「ANSI」または「A」を参照することは珍しくありません。 。


4
入力および出力と同じファイル名を使用しないでください!iconvファイルがこのサイズを超えると、32,768バイトに切り捨てられるようです。読み込もうとしているファイルに書き込み中に、ファイルが十分に小さければジョブを実行します。そうでなければ、警告なしにファイルを切り捨てます...
Niavlys 14

1
参考までに、この質問にはosxというタグが付けられており、YosemiteまたはEl Capですべて変換コマンドが機能するようには見えません。Appleが出荷するiconvバージョンは--verboseまたは-oをサポートしておらず、他の構文リダイレクトstdoutは何らかの理由で機能せず、通常のstdoutに送信するだけです。
スコットマッキンタイア

28

PowerShellあなたはこのような何かを行うことができます。

%  get-content IN.txt | out-file -encoding ENC -filepath OUT.txt

ENCはunicode、ascii、utf8、utf32のようなものです。checkout 'help out-file'。

ディレクトリ内のすべての* .txtファイルをutf8に変換するには、次のようにします。

% foreach($i in ls -name DIR/*.txt) { \
       get-content DIR/$i | \
       out-file -encoding utf8 -filepath DIR2/$i \
  }

これにより、各.txtファイルの変換されたバージョンがDIR2に作成されます。

編集:すべてのサブディレクトリのファイルを置き換えるには、次を使用します。

% foreach($i in ls -recurse -filter "*.java") {
    $temp = get-content $i.fullname
    out-file -filepath $i.fullname -inputobject $temp -encoding utf8 -force
}

最初の提案でANSIからUTFに変換すると、テキストファイルの内容がすべて消去されます
...-Acroneos

@Acroneos:あなたは間違いを犯しました:インファイルはIN.txt、アウトファイルはOUT.txtです...このように、オリジナルを上書きすることは不可能です。IN.txtとOUT.txtに同じファイル名を使用した場合は、明らかに読み取り元のファイルを上書きします。
アキラ

PowershellはBOMでUTFに変換します。findとiconvの方がはるかに簡単です。
-pparas

6

改行に関するウィキペディアのページには、変換ユーティリティに関するセクションがあります

これは、Windowsに同梱されているツールのみを使用した変換の最善策です。

TYPE unix_file | FIND "" /V > dos_file

3

UTFCastは、バッチモードをサポートするWindows用のUnicodeコンバーターです。有料版を使用していますが、非常に快適です。

UTFCastは、マウスをクリックするだけですべてのテキストファイルをUTFエンコーディングにバッチ変換できるUnicodeコンバーターです。これを使用して、元のファイルのディレクトリ構造を維持しながら、テキストファイルでいっぱいのディレクトリをUTF-8、UTF-16、UTF-32などのUTFエンコーディングに出力ディレクトリに変換できます。テキストファイルの拡張子が異なっていても問題ありません。UTFCastは自動的にテキストファイルを検出して変換できます。


彼らは同じフォルダに変換できず、別の宛先フォルダにのみ変換できるようです。
ウーヴェ・ケイム

プロ版ではインプレース変換が可能です。20ドル/ 3か月。rotatingscrew.com/utfcast-version-comparison.aspx
SherylHohman

ああ、エクスプレス(無料)バージョンは無用です-utf-8をBOMで「検出」するだけです!! (誰もが行うことができますように)。3か月ごとに20ドルで自動更新されるProバージョンのみが自動検出されます。非企業ユーザーにとって価格は急です。また、基本バージョンを試してみて、ファイルがすでにutf-8(BOMなし)である場合、このコンバーターはASCIIとしてそれを検出し、utf-8に(再)「変換」することに注意してください。 。エクスプレス版を試す前にこれに注意してください!彼らは出力を生成しないプロ用のデモ版を持っています-無意味なIMHO cuzは購入する前に結果を確認できません!
シェリルホーマン

3

findを使用した自動検出付きのOneliner

一致するすべてのテキストファイルの文字エンコード自動的に検出され、一致するすべてのテキストファイルがutf-8エンコードに変換されます。

$ find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 -o converted "$1" && mv converted "$1"' -- {} \;

これらのステップを実行するために、サブシェルshで使用される-execと、ワンライナーを実行して、-cフラグ、位置引数としてファイル名を渡す"$1"-- {}。その間、utf-8出力ファイルの名前は一時的にになりますconverted

このfindコマンドは、このようなファイル管理の自動化に非常に役立ちます。

こちらをクリックして、よりfind豊富






0

私のユースケースでは、入力エンコーディングの自動検出が必要でしたが、Windows-1250エンコーディング付きのファイルがたくさんあり、そのためにコマンドfile -bi <FILE>が戻りますcharset=unknown-8bit。これはの有効なパラメータではありませんiconv

encaで最高の結果が得られました

txt拡張子を持つすべてのファイルをutf-8に変換します

find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.