2016-03-11 14 views
6

名前に文字「」が含まれています。文字が間違ってエンコードされています

これらのファイルは十分にLinuxの(Apacheの/ PHP)の下で処理されます:彼らはWindowsの下では

$files = scandir($path); 
echo json_encode($files); 

file1⌐
file2⌐
file3⌐
file4⌐

に見えますファイルシステムによってWindows-1252として読み込まれるように、私はconditi json_encodeはここ

$files = scandir($path); 
foreach ($files as $i => $file) { 
    $files[$i] = mb_convert_encoding($file, 'UTF-8', 'Windows-1252'); 
} 
echo json_encode($files); 

を働くことができるようにonally があるなぜ彼らは

file1¬
file2¬
file3¬
file4¬

を変換しますそれらをどのようにされた変換¬に変換され、どのようにしてoriを取得できますか紳士キャラクター?

+0

私が知っていることはほとんど分かりませんが、Linuxはバックスラッシュを使用しており、Windowsはデフォルトで前方のものを使用します(バックスラッシュもサポートしています)。それを使ってみてください。 –

+1

奇妙なことは、Windows-1252には "逆符号"の文字エンコーディングさえありませんが、 "符号なし"の文字エンコーディングはあります。おそらくあなたは思ったようにWindows-1252で文字列を返さないでしょうか?あなたは確かにmb_detect_encoding()をやってみましたか? –

+0

私は_Windows-1252_を有効にする 'mb_check_encoding'を使用しています。私も 'mb_detect_encoding'を試しました(私には_UTF-8_ではないことを伝えています)。 _Windows-1252_の「逆の符号なし」の欠点 –

答えて

1

ファイル名の重要な文字unをunpack( 'C *'、$ char)してみてください。それからあなたはそれが既に0xACであることに気付くでしょう(これは¬です)。

この理由は、scandir()はWindowsの8ビットANSI Apiを使用し、置換を行い、Windows-1252にない文字に「最も近い文字」を提供するからです。テキストエディタのnotepad ++を取得し、ANSIに設定して&をコピーしてください。それは¬として表示されます(そして、私のシステムで試したときに、それはまた& pバッファーでも変わってしまいました)。

あなたは何ができますか?さてここでいくつかのオプションがありますWindows上

  1. 使用はshell_exec(「DIR/B」)(私はあなたが元の文字を取得し、これをテストした)
  2. は、¬は、Windows上のファイル名の⌐を意味し、それを置き換えることを想定しますutf-8変換後に戻る
  3. 文字がファイル名に使用されなくなるようにソフトウェアシステムを変更してください
  4. stream_encodingの機能を持つ実験的なPHPビルドを使用して、以下のコードを試してみてください。 (NB:以下の公式ビルドでのstream_encodingが、でも、ロードされたのmbstringで、未定義である:5.6.19 7.0.4)を
$myContext = stream_context_create(); 
stream_encoding($myContext, 'UTF-8'); 
$files = scandir('./', SCANDIR_SORT_ASCENDING, $myContext); 

はshell_execが、一般的に避けるべきであるが、私はこれが今のあなたの最良の選択肢だと思います。あなたができるならば、長期的には3に行くべきです。私は(私もこれをテストしていません)4をお勧めしません。あなたのシナリオが十分にわかりません。

関連する問題