特定のファイルをWindowsマシンからLinuxマシンにコピーしました。したがって、すべてのWindowsエンコード(windows-1252)ファイルはUTF-8に変換する必要があります。すでにUTF-8にあるファイルは変更しないでください。そのためにrecode
ユーティリティを使用する予定です。 recode
ユーティリティがUTF-8ファイルではなくwindows-1252エンコードファイルのみを変換するように指定するにはどうすればよいですか?
Recodeの使用例:
recode windows-1252.. myfile.txt
これにより、myfile.txt
からwindows-1252からUTF-8。これを行う前に、myfile.txt
は実際にはwindows-1252でエンコードされており、UTF-8でエンコードされていません。そうしないと、ファイルが破損する可能性があります。
ファイルがWindows-1252であることをrecodeがどのように知ると期待しますか?理論的には、any fileは有効なWindows-1252ファイルであり、考えられるすべてのバイトを文字にマッピングすると考えています。
今では確かに、強く提案 UTF-8であるという特性があります-たとえば、UTF-8 BOMで始まる場合-しかし、それらは決定的ではありません。
1つのオプションは、最初に実際に完全に有効なUTF-8ファイルかどうかを検出することです。
私は再コード化ツール自体に精通していませんが、同じエンコーディングからファイルを再コーディングできるかどうかを確認したい場合があります-無効なファイル(つまり、無効なUTF-8バイトシーケンスが含まれています)、無効なシーケンスを疑問符または類似のものに変換する可能性があります。その時点で、ファイルをUTF-8に再コーディングし、入力と出力が同一であるかどうかを確認することにより、ファイルが有効なUTF-8であることを検出できます。
または、再コードユーティリティを使用するのではなく、プログラムでこれを実行します。たとえば、C#では非常に簡単です。
繰り返しますが、これはすべてヒューリスティックです。ファイルのエンコードが本当にわからない場合は、100%の精度でそれを伝えることはできません。
iconvを使用できます:
iconv -f WINDOWS-1252 -t UTF-8 filename.txt
同様の質問に対して私が出した別の回答の書き起こしを以下に示します。
Utf8_encode()をすでにUTF8文字列に適用すると、文字化けしたUTF8出力が返されます。
このすべての問題に対処する関数を作成しました。 Encoding :: toUTF8()と呼ばれます。
文字列のエンコーディングが何であるかを知る必要はありません。 Latin1(iso 8859-1)、Windows-1252、またはUTF8にすることも、文字列にそれらを混在させることもできます。 Encoding :: toUTF8()はすべてをUTF8に変換します。
同じ文字列にUTF8とLatin1を混在させて、サービスがデータのフィードをすべて混乱させてくれたので、私はそれをしました。
使用法:
$utf8_string = Encoding::toUTF8($utf8_or_latin1_or_mixed_string);
$latin1_string = Encoding::toLatin1($utf8_or_latin1_or_mixed_string);
ダウンロード:
https://github.com/neitanod/forceutf8
更新:
別の関数Encoding :: fixUFT8()を含めました。これは文字化けしているUTF8文字列をすべて修正します。
使用法:
$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
例:
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
出力されます:
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
更新:関数(forceUTF8)をEncodingというクラスの静的関数のファミリに変換しました。新しい関数はEncoding :: toUTF8()です。
ファイルが特定のエンコードでエンコードされているかどうかを判断する一般的な方法はありません。エンコーディングは、ファイル内のビットを文字にマッピングする方法の「合意」に過ぎないことを忘れないでください。
実際にUTF-8でエンコードされているファイルとwindows-1252でエンコードされているファイルがわからない場合は、すべてのファイルを調べて自分で調べる必要があります。最悪の場合、2つのエンコーディングのいずれかでそれらのすべてを開き、「見た目」が正しいかどうかを確認する必要があります。つまり、すべての文字が正しく表示されます。もちろん、それを行うためにツールサポートを使用できます。たとえば、windows-1252とUTF-8で異なるマッピングを持つファイルに特定の文字が含まれていることが確実にわかっている場合は、grepを実行できます。 Seva Akekseyevが述べたように、「iconv」でファイルを実行した後。
もう1つの幸運なケースは、ファイルに実際にUTF-8とwindows-1252の両方で同じようにエンコードされた文字のみが含まれていることを知っている場合です。その場合、もちろん、あなたはすでに終わっています。
単一のコマンドで複数のファイルの名前を変更する場合–すべての*.txt
ファイル‒コマンドは次のとおりです。
find . -name "*.txt" -exec iconv -f WINDOWS-1252 -t UTF-8 {} -o {}.ren \; -a -exec mv {}.ren {} \;
iconvコマンドを使用します。
ファイルがWindows-1252にあることを確認するには、Windowsでメモ帳でファイルを開き、[名前を付けて保存]をクリックします。メモ帳では、現在のエンコードがデフォルトとして提案されています。 Windows-1252(または1バイトのコードページ)の場合、「ANSI」と表示されます。
Notepad ++などのエディターを使用して、ファイルのエンコードを変更できます。エンコードに移動して、必要なものを選択してください。
私は常にWindows 1252を好む
UTF-8は不必要で無効なため、BOMはありません。 BOMが役立つのは、Microsoftの場合のようにバイトスワップされるUTF-16です。メモリバッファの内部表現の場合はUTF-16。交換にはUTF-8を使用します。デフォルトでは、UTF-8、US-ASCIIおよびUTF-16から派生したものはいずれも、自然/ネットワークバイト順です。 Microsoft UTF-16はバイトスワップされるため、BOMが必要です。
Windows-1252をISO8859-15に変換するには、まず、類似のグリフを持つコードのISO8859-1をUS-ASCIIに変換します。次に、Windows-1252をISO8859-15まで、その他のISO8859-15以外のグリフを複数のUS-ASCII文字に変換します。
これを見つけました TYPEコマンドのドキュメント :
ASCII(Windows1252)ファイルをUnicode(UCS-2 le)テキストファイルに変換します。
For /f "tokens=2 delims=:" %%G in ('CHCP') do Set _codepage=%%G
CHCP 1252 >NUL
CMD.EXE /D /A /C (SET/P=ÿþ)<NUL > unicode.txt 2>NUL
CMD.EXE /D /U /C TYPE ascii_file.txt >> unicode.txt
CHCP %_codepage%
上記の手法(Carlos Mのスクリプトに基づく)は、最初にバイトオーダーマーク(BOM)を使用してファイルを作成し、元のファイルの内容を追加します。 CHCPを使用して、セッションがWindows1252コードページで実行されていることを確認して、文字0xFFおよび0xFE(ÿþ)が正しく解釈されるようにします。
ファイルがUTF-8またはWindows 1252(またはLatin1)であることが確実な場合、無効なファイルを変換しようとすると、recodeがエラーで終了するという事実を利用できます。
Utf8は有効なWin-1252ですが、その逆は当てはまりません。win-1252は有効なUTF-8ではありません。そう:
recode utf8..utf16 <unknown.txt >/dev/null || recode cp1252..utf8 <unknown.txt >utf8-2.txt
すべてのcp1252ファイルのエラーを吐き出し、それらをUTF8に変換します。
これをよりきれいなbashスクリプトにラップし、変換されたすべてのファイルのバックアップを保持します。
文字セット変換を実行する前に、すべてのファイルで一貫した行末を使用することを最初に確認することをお勧めします。それ以外の場合、再コード化はそのために文句を言い、すでにUTF8であったが間違った行末を持っているファイルを変換するかもしれません。