Nasıl UTF-8 dizelerini kullanarak, PHP dosya sistemi fonksiyonları kullanabilirim?

4 Cevap php

UTF-8 karakterleri ile klasör oluşturmak için mkdir kullanamazsınız.

<?php

$dir_name = "Depósito";
mkdir($dir_name );

?>

Windows Explorer'da bu klasöre göz Ama, ne zaman, klasör adı bu gibi görünüyor:

Depósito

Ben ne yapmalıyım?

4 Cevap

Just urlencode the string desired as a filename. All karakter (daha sonra olabilir, sadece {[(NTFS / HFS / UNIX) urlencode dosya geçerlidir döndü 4)]} arka UTF-8 (veya ne olursa olsun kodlama onlar vardı) dosya.

Uyarılar (hepsi de aşağıdaki çözümleri için geçerlidir):

  • Url-kodlama sonra, dosya 255 karakter (muhtemelen bayt) daha az olmalıdır.
  • UTF-8 multiple representations (birleştirerek karakterleri kullanarak) birçok karakter için vardır. Eğer UTF-8 normalleştirmek yoksa, sorun glob ile arama veya tek bir dosyayı yeniden açmayı olabilir.
  • Sen scandir veya alfa-sıralama için benzer fonksiyonlar güvenemez. Sen urldecode dosya isimleri daha sonra UTF-8 (ve alfabe) farkında bir sıralama algoritması kullanmanız gerekir.

Worse Solutions

Aşağıda daha karmaşık ve daha az çekici uyarılar ile çözümler vardır.

Windows'ta, PHP, dosya sistemi sarıcı bekliyor ve dosya / dizin adları için ISO-8859-1 dizeleri döndürür. Bu size iki seçenek sunar:

  1. Lütfen dosya özgürce UTF-8 kullanın, ama anlıyorum olmayan ASCII karakterleri olacak appear incorrect PHP dışarıda. A non-ASCII UTF-8 karakter birden single, ISO-8859-1 karakter olarak saklanır. Örneğin ó ó Windows Explorer gibi görünür olacaktır.

  2. characters representable in ISO-8859-1 için dosya / dizin adlarını sınırlayın. Uygulamada, UTF-8 orijinal dosya adlarını almak için utf8_decode before using them in filesystem functions, and pass the entries scandir gives you through utf8_encode aracılığıyla UTF-8 dizeleri geçmek gerekir.

Uyarılar bolca!

Muhtemelen sadece transliterate dosya adlarını oluşturmak için neden bu kabus.

Sorun, Windows, Linux ve diğerleri farklı karakter setlerini kullanmak ise, dosya sistemi dizeleri için utf-16 kullanır, ancak çoğu zaman utf-8 olmasıdır. Sen bir utf-8 dizesi sağlanan, ancak bu Windows başka bir 8-bit karakter kümesi kodlaması olarak yorumlanır, belki de Latin-1 ve utf-8 2 bayt ile kodlanmış daha sonra non-ASCII karakter olarak ele alınır Windows'ta 2 karakter olsaydı.

Normal bir çözüm ascii daki kaynak kodu% 100 tutmak için, ve başka bir yerde dizeleri sahip olmaktır. Ancak, PHP6 vb Unicode işlevlerini tanıtır, bu yüzden bu bakmak isteyebilirsiniz.

Unix ve Linux (ve muhtemelen çok OS X altında), mevcut dosya sistemi kodlama LC_CTYPE yerel parametresi (function setlocale (bkz.)) tarafından verilir. Örneğin, kodlama UTF-8 olduğu anlamına gelir "en_US.UTF-8" gibi bir şey değerlendirmek olabilir. Sonra dosya adları ve yolları bu kodlama ile fopen () veya dir tarafından alınan () ile oluşturulabilir.

Windows altında PHP isimleri de seçilen "kod sayfası" için (Windows 2000 ve sonrası) dosya sistemi tarafından kullanılan UTF-16 ileri ve geri dönüştürülür dosyası, bir "non-Unicode farkında programı" olarak çalışır. "-> Unicode olmayan programlar için dil İdari" dosya adları için çevirisi kod sayfasını ayarlar ise kontrol paneli "Bölge ve Dil Seçenekleri", sekmesi paneli "Biçimleri", LC_CTYPE seçeneği ile alınan kod sayfasını ayarlar. Batı ülkelerinde LC_CTYPE parametre de ISO-8859-1 ile benzer (ama tam olarak eşit değil) "Windows-1252 kodlaması" olarak bilinen 1252 kod sayfası "language_country.1252", gibi bir şey değerlendirir. Japonya'da 932 kod sayfası yerine genellikle ayarlanır, ve böylece diğer ülkelere içindir. PHP altında kimin adı geçerli kod sayfası ile ifade edilebilir dosyaları yaratabilirsiniz. Dosya sisteminden alınan tersi, dosya adları ve yolları mevcut "en uygun" geçerli kod sayfasını kullanarak bayt UTF-16 dönüştürülür:

http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/

Bu haritalama yaklaşılır, bu nedenle bazı charactes öngörülemeyen bir şekilde karıştırılmış olabilir. Bunun yaklaşık "Caffe Brilli dönecekti Örneğin," Caffé Brillì.txt ", PHP dize geçerli kod sayfası 1252 ise beklendiği gibi" Caff \ xE9 Brill \ xEC.txt "olarak dir () tarafından döndürülen olacaktır. "Bir japon sistemde aksanlı vouels 932 kod sayfası eksik ve daha sonra onların yerini çünkü" txt en uygun "olmayan aksanlı vouels. Hiç tercüme edilemez Karakterler "?" Olarak alınır (Soru işareti). Genel olarak, Windows altında böyle eserler algılamak için güvenli bir yol yoktur.

Daha fazla detay PHP hata NO benim cevapta mevcuttur. 47096 mevcut at:

https://bugs.php.net/bug.php?id=47096

com_dotnet PHP uzantısı kullanarak, 'Scripting.FileSystemObject Windows'u erişmek ve daha sonra UTF-8 dosya / klasör adları ile istediğiniz her şeyi yapabilirsiniz.

Ben bir PHP akışı sarıcı olarak bu paketlenmiş, bu yüzden kullanımı çok kolay:

https://github.com/nicolas-grekas/Patchwork-UTF8/blob/lab-windows-fs/class/Patchwork/Utf8/WinFsStreamWrapper.php

First verify that the com_dotnet extension is enabled in your php.ini then enable the wrapper with:

stream_wrapper_register('win', 'Patchwork\Utf8\WinFsStreamWrapper');

Son olarak, (mkdir, fopen, vb yeniden adlandırmak) alıştığınız işlevlerini kullanın, ama win:// ile yolunu önek

Örneğin:

<?php
$dir_name = "Depósito";
mkdir('win://' . $dir_name );
?>