2016-03-11 9 views
6

Adında karakterini içeren dosyalar var.Karakter yanlış kodlanmış

Bu dosyalar iyi Linux (Apache/php) kapsamında ele alınır: bunlar Windows altında

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

file1⌐
file2⌐
file3⌐
file4⌐

görünüyor Dosya sistemi tarafından Windows-1252 olarak okunacak, bu yüzden ben conditi zorunda kaldı json_encode İşte

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

işe yarayabilir, böylece onally Neden onlar

file1¬
file2¬
file3¬
file4¬

dönüştürülür bunların nasıl olduğunu dönüştürmek ¬'a dönüştürülecek ve nasıl yönlendirebilirim ginal karakter?

+0

Ne istediğinizi belirsiz değil, ama bildiğim, Linux'un ters eğik çizgi kullandığı ve pencerelerin varsayılan olarak bir ön sekmeyi kullandığı (ancak ters eğik çizgileri de desteklediği). Bunu kullanmayı dene. –

+1

Garip olan şey, Windows-1252'nin "ters işaret" için kodlama yapan bir karaktere sahip olmaması, ancak "işaretsiz" için bir tane içermesidir. Belki düşündüğün gibi Windows-1252'de ipi geri almıyorsun? Emin olmak için mb_detect_encoding() yapmayı denediniz mi? –

+0

Kullanıyorum beni _Windows-1252_ 'mb_check_encoding' kullanıyorum. Ayrıca mb_detect_encoding' denedim (bana _UTF-8_ değil). _Windows-1252_ yok "ters işareti" için iyi bir nokta –

cevap

1

Lütfen dosya adlarınızın kritik karakterindeki un ('C *', $ char) paketini açmayı deneyin. Sonra zaten 0xAC olduğunu (ki ¬) olduğunu göreceksiniz.

Bunun nedeni, scandir() bir Windows 8-bit ANSI Api kullanır ve Windows-1252'de olmayan karakterler için bazı "en yakın eşleşen karakter" sağlar. Metin düzenleyici notepad ++ alırsanız, aynı davranışı gözlemleyebilirsiniz, ANSI'ye ayarlayın ve & yapıştırın your içine yapıştırın. As olarak görünecektir (ve sistemimde denediğimde, eğlenceli bir şekilde c & p tamponunda da değişti).

Ne yapabilirsiniz? Windows üzerinde

  1. Kullanım shell_exec ('dir/b') (Ben orijinal karakter olsun, bu test)
  2. o Windows dosya adları için ⌐ araçları karşı¬lanabilir varsayalım ve sadece değiştirin: Eh burada bazı seçenekler şunlardır karakter ⌐ dosya adları
  3. Kullanım işlevi stream_encoding vardır ve aşağıdaki kodu deneyin bazı deneysel php inşa artık kullanılır yani geri utf-8 dönüşümden sonra
  4. yazılım sistemini değiştirin
  5. . (Not: stream_encoding bile şu yetkilinin, yüklenen Mbstring ile tanımsız oluşturur: 5.6.19 7.0.4) shell_exec genellikle kaçınılmalıdır iken
$myContext = stream_context_create(); 
stream_encoding($myContext, 'UTF-8'); 
$files = scandir('./', SCANDIR_SORT_ASCENDING, $myContext); 

, bu şimdilik en iyi seçenek olduğunu düşünüyorum . Uzun vadede yapabiliyorsanız 3 için gitmelisiniz. 4. (Ben de bunu test etmedim) tavsiye etmem ve sen 2. geçerli olup olmadığını anlamak için senaryonuz hakkında yeterli bilgi sahibi değilim.