PHP dosya adı (ya da tam yolu bir dir) UTF-8 karakter alabilir miyim?

4 Cevap php

Ben, ismi bu UTF-8 karakterleri olan bir PHP dosyası erişmek istiyorum.

Dosya içinde bir Reçetesi yoktur. Sadece birkaç unicode karakterleri görüntüler bir yankı deyimi içerir.

Tarayıcı (Firefox 3.0.8, IE7) HTTP hatası 500 sonuç gelen PHP sayfası erişme.

Apache günlüğüne iki girişleri vardır (dosya / க php, mektup க bir kompozit biridir ve Xae aşağıda günlüğüne x95 \ \ XE0 \ karakterlere karşılık gelir.):

[Cmt 4 Nisan 09:30:25 2009] [error] [client 127.0.0.1] PHP Warning: Unknown: satır 0 Bilinmeyen böyle bir dosya ya da dizin yok: failed to open stream

[Cmt 4 Nisan 09:30:25 2009] [error] [client 127.0.0.1] PHP Fatal error: Unknown: 'D :/ va / ROOT / \ XE0 \ Xae \ x95.php' (include_pathdaki = 'gerekli Başarısız açılış .; C: \ php5 \ pear ') hattı 0 üzerine Unknown

Dosya ve dizin adları İngilizce olduğunda aynı sayfa çalışıyor. Aynı ayarda, bu sayfalar için SSI kullanarak sorun yoktur.

EDIT

Bir faktör olarak görünmüyor çünkü url yeniden yazma kaldırıldı bilgi.

Mod_rewrite kaldırıldığında, PHP dosya hala çalışmıyor. Dosyası olmayan bir UTF adına yeniden adlandırılır çalışır. Ancak, shtml bile dosya ve / veya yol adını UTF karakterleri ile çalışır.

4 Cevap

Ben aynı sorunu rastlamak ve biraz araştırma yaptım ve aşağıdaki sonuçlandırmak var. Bu, Windows üzerinde php5 için; muhtemelen diğer platformlarda doğrudur ama ben bakmadım.

  1. TÜM php dosya sistemi fonksiyonları (dir, is_dir, is_file, dosya, filemtime, dosya boyutu, File_exists vb) sadece kabul etmek ve ne olursa olsun program veya ini dosyaları belirlenen default_charset arasında ISO-8859-1 dosya adları dönmek.

  2. Bir dosya adı içeren nerede eğer varsa bir unicode karakter dir-> okuma, aksi takdirde bir soru işareti yerine geçecek, ilgili ISO-8859-1 karakter olarak dönecektir.

  3. Bir dosyayı başvururken, örneğin UTF-8 dosya adının geçmesi halinde adı herhangi iki bayt veya daha fazla karakter içeriyorsa is_file veya dosyada, dosya bulunamadı olmayacaktır. Ancak, is_file (utf8_decode ($ dosya)) vb UTF-8 karakter ISO-8859-1 gösterilebilir olması koşuluyla çalışacaktır.

Diğer bir deyişle, PHP5 tüm adlarında çoklu-bayt karakterler ile dosya adresleme yeteneğine sahip değildir.

Multibyte karakterleri ile UTF-8 İstenen URL ve bu doğrudan bir dosyaya karşılık ise, PHP onu ele çünkü dosyayı açmak mümkün olmayacaktır.

Sadece kendi dilinizde oldukça URL'leri istiyorsanız mod_rewrite kullanarak öneri iyi biri gibi görünüyor.

Eğer depolama ve yüklenen ve kullanıcılar tarafından indirilen dosyaları almak Ama eğer, bu sorun çözülecek vardır. Tek yönlü bir veritabanı veya XML dosyası veya bazı gibi sunucu ve dizin dosyaları üzerinde, böyle bir artan bir sayı olarak, keyfi bir (non UTF-8) dosya adını kullanmaktır. Başka bir yol, bir BLOB olarak veritabanında kendisi dosyaları saklamak için. (Senin dizin bozuk alırsa belki ne olup bittiğini görmek için kolay ve sorunlara tabi değildir) başka bir yolu dosya adlarını kendiniz kodlamak için - iyi bir teknik sunucusunda saklarken (sic) tüm gelen dosya adlarını UrlEncode için Disk ve indirmek için mim başlığındaki dosya ayarlamadan önce bunları UrlDecode. (% Hariç) tüm bile belli belirsiz sıradışı karakterler sonra% nn olarak kodlanmış ve böylece dosya isimleri boşluk ile herhangi bir sorun, çapraz platform desteği ve desen eşleştirme büyük ölçüde önlenir.

  • Ben bir gerçeği PHP'nin kendisi ben MediaWiki (PHP tabanlı, ayrıca Wikipedia çalışır) Unicode sayfa adlarını kullanarak denedim ve o iş yapar, çünkü can, Unicode URL'ler ile çalışmak için biliyorum. Gibi, örneğin, / index.php / PAGE_NAME © gibi URL'ler. Yani PHP işleyebilir. Ama Apache kaynak dosyası UTF-8 adı olan bir dosyayı bulma ile ilgili bir sorun olabilir.

  • Karakter kodlama php.ini ayar bunu etkileyen edilmemelidir; belirli bir kaynak bulmak ve bir PHP dosyası olduğu tespit bir kez daha sonra PHP aramak için web sunucusunun işidir. Bu web sunucusu, ve temel dosya sisteminin kendisi, UTF-8 dosya ile başa çıkabilmek olması anlamına gelecektir.

  • Bu mod_rewrite kural olmadan çalışır mı? Yani, sen RewriteEngine ile yeniden yazma motoru kapalı devre dışı bırakın ve sonra va.in / utf_dir / utf_file.php istemek? Eğer öyleyse, o zaman bir mod_rewrite yapılandırma sorunu veya kural ile ilgili bir sorun olabilir.

  • Sadece böyle eski tarayıcılar gibi bir adres, yazdığınızda URL'leri Unicode düzgün bazı tarayıcılarda desteklenmiyor olabilir. Eski tarayıcılar UTF-8 kodlama adımı atlayabilirsiniz. Eğer olsa bu sayfa UTF-8 kodlanmış bir sayfada bir bağlantıyı, şu eğer bu çalışma onu engel olmamalıdır.

Karakter seti sırf UTF-8 Unicode tüm yüksek karakterlerini destekler anlamına gelmez.

Unicode desteği önemli eklerden biri PHP 6 ve PHP 5 geliyor unicode desteğini eksik için nutorious olmasıdır.

PHP komut linki oluşturuyor ise apache doğrudan url yorumlamak ve yönlendirmek ise farklı bir sorun olabilir.

No PHP dosya adları ASCII olmalı, sizin sunucu PHP5 biz PHP 6 beklemek öylesine baş edemez kurmak ne kadar önemli değildir. Bir PHP komut dosyası içinde size utf8_decode kullanarak utf-8 dosya / url işleyebilir. Sen konularda bir sürü etrafında almak için bir. Htaccess ve SQL kullanabilirsiniz ama bir unicode dosya çalıştırmak için hiçbir yolu yoktur.

David Earl cevabı doğrudur.