2011-01-27 8 views
1

アップロードされたファイルを扱う際に、私は奇妙なエンコーディングの問題に遭遇しています。非UTF8ファイル(Google CSVファイル)

私はあらゆる種類のテキストファイルを受け入れ、内容を読むことができる必要があります。特に、Google連絡先のエクスポートからダウンロードしたファイルに問題があります。

私は通常のutf8_encode/decode、mb_detect_encodingなどを行っています。文字列がUTF-8であるかのように常に戻り、多くのiconvオプションを試してエンコードを元に戻しましたが失敗しました。

test.phpを

header('Content-type: text/html; charset=UTF-8'); 

if ($stream = fopen($_FILES['list']['tmp_name'], 'r')) 
{ 
    $string = stream_get_contents($stream); 

    fclose($stream); 
} 

echo substr($string, 0, 50); 
var_dump(substr($string, 0, 50)); 
echo base64_encode(serialize(substr($string, 0, 50))); 

出力私はbase64でピースをデコード

��N�a�m�e�,�G�i�v�e�n� �N�a�m�e�,�A�d�d�i�t�i�o�n� 
��N�a�m�e�,�G�i�v�e�n� �N�a�m�e�,�A�d�d�i�t�i�o�n� 
czo1MDoi//5OAGEAbQBlACwARwBpAHYAZQBuACAATgBhAG0AZQAsAEEAZABkAGkAdABpAG8AbgAiOw== 
+2

エンコードエラーがあまりにも曖昧です。私たちには例が必要です。 'base64_encode(serialize($ excerpt))'をここに投稿してみてください。 – mario

+0

例を抜粋して更新しました。 – James

+0

$ stringはどこから来たのですか?それを取得するために使用しているコードを表示できますか?これを出力するエンコードは何ですか? –

答えて

3

文字列の先頭には、UTF-16リトルエンディアンのByte Order Markを表すバイト\ xFF \ xFEが含まれています。すべての文字は実際には2バイトのシーケンスです。主に\ 0の後ろにASCII文字が続きます。

これらをコンソールに印刷すると、ターミナルクライアントはUTF-16シーケンスを正しく解釈します。しかし、配列全体を表示可能にするには、アイコンを手動でデコードする必要があります。

+0

http://www.codeunit.co.za/2010/03/05/php-convert-a-utf-16-string-to-a-utf-8-string/変換するコードを提供しました。ありがとうございましたBOM – James

+0

@James、大規模なインポートシナリオでこのfn()を使用しましたか?私は大きなファイル(10から200メガバイト)をアップロードするユーザーに直面しており、これをすべてのフィールドで実行することは実行可能ではないようで、メモリにすべてロードするだけの贅沢はありません。 – Jakub

+1

@ Jakub:[iconv( "UTF-16"、 "UTF-8"、$ str)](http://www.php.net/manual/en/function.iconv.php)関数をそれ。あるいは、アップロードされたファイルが読み込まれないようにするには、BSD/Linuxサーバ上で高速なインプレース変換を行うために 'system(" recode UTF-16..UTF-8 '$ filename' ");を実行してください。 – mario

0

は、私は奇妙な混合文字列を見ました:s:50:"\xff\xfeN\x00a\x00m\x00e\x00,\x00G\x00i\x00v\x00e\x00n\x00 \x00N\x00a\x00m\x00e\x00,\x00A\x00d\x00d\x00i\x00t\x00i\x00o\x00n\x00"。 2番目の:の後の部分は、ASCII "で囲まれた2バイトのUnicode(UCS2)文字列であり、 "s"と "50"はプレーンなASCIIです。その\ff\feは、UCS2文字列のバイトオーダーマークです。これは非常識ですが、分析可能です。

入力文字列を:で分割し、最初と最後からそれぞれ"を除き、それぞれの結果の文字列を別々にデコードしようとします。

関連する問題