2016-09-01 4 views
0

私はインターネット上のすべてを見て、答えを見つけることができません。CSVをPHPでUTF-8に変換する方法

私は何千というCSVをソースから奪っています。 CSVには、任意の文字エンコードを使用できます。だから私はそれらをすべてUTF-8に変換する必要がある。

utf-8をutf-8に変換するとデータが壊れてしまいますので、私がしようとしているのはファイルの文字エンコーディングを検出し、utf-8を変換したいのであればそれはutf-8(私はiconvを使用する予定です)。

私はスタックオーバーフロー(および他のサイト)ですべてを試しましたが、私はファイルの現在のエンコーディングを取得できないようです。

私が使用している場合は

mb_detect_encoding(file_get_contents($csvPath), mb_detect_order(), TRUE); 

または

mb_detect_encoding(file_get_contents($csvPath),'auto'); 

持っている人、私はcsvファイルのエンコーディングを検出するか、私は知らなくてもファイルを変換することができ、より良い方法を持つことができる方法上の任意の提案を得ました元のエンコーディング。

+4

オリジナルのエンコーディングがわからない場合は、推測できることがあります。このため、エンコードを保存/認識/伝達することが重要です。 –

+0

「推測」のためのあなたの最高のアドバイスは何でしょうか?エンコーディングを推測し、変換してみて、次のエンコーディングを試みると文字が混乱していないかどうかを確認するファイルを読み込みますか? –

+0

また、bbeditやtextwranglerのようなプログラムがエンコーディングを検出する方法を知っていますか?彼らは完全にそれをするようです。 –

答えて

0

Ivは数時間の試行錯誤の末にそれを理解しました。 mb_detect_encodingが役に立たないことを忘れてしまいます。

をシェルに追加し、iconv(OSXおよびLinuxではデフォルトでインストールされます)を使用します。

$output = shell_exec("file --mime-encoding GBP_AUD_Week1.csv"); 
$output = str_replace("$csvPath: ", '', $output); 

これは、現在のファイルのエンコーディングを与える

shell_exec(iconv -f $output -t utf-8 GBP_AUD_Week1.csv > GBP_AUD_Week1Converted.csv); 

注:私は、代わりに新しいものを作成するファイルを上書きしようとしたが、私が行ったときに、このファイルが空白だったとエンコーディング バイナリでした。

+0

これはまだ予測できないほど失敗する可能性があります...エンコーディングを正しく推測することは基本的に不可能です。ファイルはバイトの袋で、テキストファイル(CSVを含む)は正しいエンコーディング人間が読めるようにするテキスト。バイトの任意の袋は、異なるテキストをもたらすいくつかの符号化で解釈することができる。このテキストが「正しい」かどうか、人間が判断できるだけではない(統計分析装置でさえ、最高で信頼度を与えることができます)。 – deceze

+0

コメントありがとう、私はこれを既に理解していますが、私は本当にたくさんの選択肢がありません:(私のプログラムは何千ものCSVを擦り落として、テキストラングラーのようなものを開いて新しいエンコーディングで保存することはできません私の問題は、私がUnicode UTF-16で文字列の比較をしないで、隠れた文字を削除する正規表現を使用することです(また、CSVは任意のエンコーディングである可能性がありますので、私の1ビットの正規表現は十分ではありません)。 –

+0

私は統計的なエンコーディングディテクタを使用しようとしています(いくつかのエンコーディングを試していますが、そうでないものも試してみます)。完全に無効であり、復号化されたテキストに関する統計分析を行い、その文字が所定の言語で適切な単語を形成するように見えるかどうかをチェックする)、結果の人間による検査、少なくとも信頼スコアの低い結果。 s私はこのような状況を最初から避けようとしています。 ;-) – deceze

関連する問題