2016-03-11 17 views
6

Mam pliki zawierające znak w ich nazwie.Znak błędnie zakodowany

Pliki te są dobrze obsługiwane w systemie Linux (Apache/PHP):

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

file1⌐
file2⌐
file3⌐
file4⌐

W systemie Windows wydają być odczytywanym jako Windows-1252 przez system plików, więc musiałem conditi onally konwertować je tak, że json_encode mógł pracować

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

Oto jak one przekonwertowane

file1¬
file2¬
file3¬
file4¬

Dlaczego jest nawrócenie się na ¬ i jak mogę uzyskać ori charakter dinozaurów?

+0

Nie mam pojęcia, czego chcesz, ale wiem, że Linux używa ukośnika odwrotnego, a system Windows domyślnie korzysta z okna do przodu (ale obsługuje również ukośniki odwrotne). Spróbuj tego użyć. –

+1

Dziwne jest to, że Windows-1252 nie ma nawet kodowania znaków dla "reverse not sign", ale ma jeden dla "niezalogowania się". Może nie odzyskujesz ciągów w Windows-1252, tak jak myślałeś? Czy próbowałeś zrobić mb_detect_encoding() tylko, aby być pewnym? –

+0

Używam 'mb_check_encoding', który sprawdza mnie _Windows-1252_. Próbowałem też 'mb_detect_encoding' (mówiąc mi, że to nie _UTF-8_). Dobry punkt dla "odwrotnego znaku niezapisanego" nieobecnego na _Windows-1252_ –

Odpowiedz

1

Proszę spróbować rozpakować ("C *", $ char) na kluczowym znaku ⌐ swoich nazw plików. Wtedy zauważysz, że jest to już 0xAC (co oznacza ¬).

Powodem tego jest to, że scandir() używa 8-bitowego interfejsu ANSI API systemu Windows, który dokonuje podstawienia i zapewnia trochę "najbardziej pasującego znaku" dla znaków, które nie są w systemie Windows-1252. Możesz zaobserwować to samo zachowanie, jeśli dostaniesz edytor tekstu ++, ustaw go na ANSI i spróbuj skopiować & wkleić do niego ⌐. Pojawi się jako ¬ (i wesoło zmieniło się również w buforze c & p, kiedy wypróbowałem go w moim systemie).

Co możesz zrobić? Więc oto kilka opcji:

  1. Zastosowanie shell_exec („dir/b”) w systemie Windows (testowałem tego, masz oryginalny charakter)
  2. Załóżmy, że ¬ środki ⌐ dla nazw plików w systemie Windows i po prostu zastąpić go powrót po konwersji utf-8
  3. Zmień system oprogramowania, aby znak ⌐ nie był już używany w nazwach plików
  4. Użyj eksperymentalnej wersji php, która ma funkcję stream_encoding i wypróbuj poniższy kod. (NB: stream_encoding jest niezdefiniowane, nawet z mbstring załadowany, w następującym urzędnika buduje: 5.6.19 7.0.4)
$myContext = stream_context_create(); 
stream_encoding($myContext, 'UTF-8'); 
$files = scandir('./', SCANDIR_SORT_ASCENDING, $myContext); 

Choć powinny być ogólnie unikać shell_exec, myślę, że jest to najlepsza opcja na teraz . Na dłuższą metę powinieneś wybrać 3, jeśli możesz. Nie polecałbym 4. (także tego nie testowałem) i nie wiem wystarczająco dużo o twoim scenariuszu, aby stwierdzić, czy 2. jest wykonalny.