43

特定のファイルを Windows マシンから Linux マシンにコピーしました。そのため、Windows でエンコードされた (windows-1252) ファイルはすべて UTF-8 に変換する必要があります。すでに UTF-8 になっているファイルは変更しないでください。recodeそのためにユーティリティを使用する予定です。recodeユーティリティが Windows-1252 でエンコードされたファイルのみを変換し、UTF-8 ファイルを変換しないように指定するにはどうすればよいですか?

recode の使用例:

recode windows-1252.. myfile.txt

myfile.txtこれにより、windows-1252 から UTF-8 に変換されます。myfile.txtこれを行う前に、実際には Windows-1252 でエンコードされており、UTF-8 でエンコードされていないことを知りたいです。そうしないと、ファイルが破損すると思います。

4

11 に答える 11

39

ファイルがWindows-1252であることをrecodeが認識することをどのように期待しますか?理論的には、すべての可能なバイトを文字にマップするため、どのファイルも有効なWindows-1252ファイルであると思います。

これで、UTF-8であることを強く示唆する特性が確かにあります(たとえば、UTF-8 BOMで始まる場合)が、決定的なものではありません。

1つのオプションは、最初にそれが実際に完全に有効なUTF-8ファイルであるかどうかを検出することです。

私は再コード化ツール自体に精通していませんが、無効なファイル(つまり、無効なUTF-8バイトシーケンスを含むファイル)でファイルを再コード化できるかどうかを確認したい場合があります)無効なシーケンスを疑問符などに変換する可能性があります。その時点で、ファイルをUTF-8に再コーディングし、入力と出力が同一であるかどうかを確認することで、ファイルが有効なUTF-8であることを検出できます。

または、recodeユーティリティを使用するのではなく、プログラムでこれを実行します。たとえば、C#では非常に簡単です。

繰り返しになりますが、これはすべてヒューリスティックです。ファイルのエンコーディングが本当にわからない場合は、100%の精度でそれを伝えることはできません。

于 2010-01-06T15:42:34.927 に答える
9

これは、同様の質問に対して私が行った別の回答の転写です。

すでに UTF8 文字列に utf8_encode() を適用すると、文字化けした 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() です。

于 2012-09-20T00:15:38.133 に答える
8

1 つのコマンドで複数のファイルの名前を変更したい場合、たとえばすべての*.txtファイルを変換したいとします。コマンドは次のとおりです。

find . -name "*.txt" -exec iconv -f WINDOWS-1252 -t UTF-8 {} -o {}.ren \; -a -exec mv {}.ren {} \;
于 2016-01-19T15:54:53.753 に答える
2

iconvコマンドを使用します。

ファイルがWindows-1252にあることを確認するには、メモ帳(Windowsの場合)でファイルを開き、[名前を付けて保存]をクリックします。メモ帳は、デフォルトとして現在のエンコーディングを提案します。Windows-1252(または1バイトのコードページ)の場合は、「ANSI」と表示されます。

于 2010-01-06T15:42:51.933 に答える
1

notepad++ などのエディタを使用して、ファイルのエンコーディングを変更できます。エンコーディングに移動して、必要なものを選択するだけです。

私は常に Windows 1252 を好みます

于 2013-03-27T17:03:25.077 に答える
0

ファイルが 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 スクリプトにラップし、変換されたすべてのファイルのバックアップを保持します。

文字セット変換を行う前に、すべてのファイルで行末が一貫していることを最初に確認することをお勧めします。そうしないと、recode がそのために文句を言い、すでに UTF8 であるが行末が間違っているファイルを変換する可能性があります。

于 2010-12-20T15:16:02.057 に答える