PHP ve Farklı Unicode Kodlamalarının UTF8 Filenames

2 Cevap php

Ben bir sunucu çalışan linux Unicode karakterler içeren bir dosya var. Ben sunucuya SSH ve hiçbir sorun dosya / klasör erişen unicode karakter içeren dosya / klasöre gitmek için sekme tamamlama kullanın. Sorun PHP ile dosyayı erişmeyi deneyin ne zaman doğar (Ben gelen dosya sistemine erişen edildi işlevi oldu stat). Ben çıkış yolunu tarayıcıya PHP komut dosyası tarafından oluşturulan ve terminale yapıştırın eğer dosya da (hatta terminalde bakarak olsa dosya yolları tamamen aynıdır) var gibi görünüyor.

Ben varsayılan php_ini aracılığıyla kodlama yanı sıra set olarak UTF8'i kullanmak için PHP set mb_internal_encoding. Ben PHP filepath dize kodlamasını kontrol ve olması gerektiği gibi, UTF8 olarak ortaya çıkıyor. Biraz kurcalama daha ben hexdump é karakterine karar terminalin sekme tamamlama ve hexdump PHP komut dosyası tarafından oluşturulan 'normal' é karakterin veya tarafından karşılaştırın elle klavye (os x üzerinde opsiyon + e + e) ​​üzerinden karakter girme. İşte sonuç:

echo -n é | hexdump
0000000 cc65 0081                              
0000003
echo -n é | hexdump
0000000 a9c3                                   
0000002

Terminalin doğru bir dosya referansı sağlar: e karakter 3 bayt biridir. Ben nereye gidileceği, hangi kodlama PHP kullanmanız gereken emin değilim? I iconv veya mb_convert_encoding ile başka kodlama yolunu dönüştürmek olmalıdır?

2 Cevap

Ben etrafında karıştırmak ve belirli bir karakterin farklı unicode ayrışmaları normalleştirilmesi için bazı yöntemler bulmak mümkün iki cevap verilen ipuçları sayesinde. Ben bir OS X Karbon uygulama tarafından oluşturulan dosyaları erişen edildi sahip durumda ben karşı karşıya geldi. Bu oldukça popüler bir uygulama olduğunu ve dolayısıyla dosya isimleri belirli bir unicode ayrışmaya bağlı gibiydi.

PHP 5.3 'te bir new set of functions belirli bir ayrışma bir unicode dize normalleştirmek için izin tanıtıldı. Görünüşe göre size unicode dize ayrışan dört ayrışma standartlar vardır. Python unicode.normalize üzerinden 2.3 sürümü beri unicode normalleşme capabilties olmuştur. This article unicode dizelerini Python kullanım ile ilgili biraz daha iyi işleme kodlama / dize anlamada yardımcı oldu.

Burada bir unicode dosya yolunu normalleştirilmesi konusunda hızlı bir örnek:

filePath = unicodedata.normalize('NFD', filePath)

Bu unicode dosya adları için standart ayrışma olduğunu ise ben NFD biçimi bütün benim amaçlar için çalıştı bulundu, ben merak ediyorum.

Birincisi: Bu dosyaların isimleri empoze semantik önlemek için çalışmalısınız. PHP sizin senaryoda dosya adlarını üreten neden ben gerçekten söyleyemem, bu yüzden bu kuralı uygulamak gerektiğini nasıl tavsiye edemez.

É farklı (iki bayt ve üç bayt) temsilcilikleri Unicode bu karakterin oluşan ve çürümüş varyasyonlar UTF-8 kodlamaları vardır. Unicode bu aynı görsel karakteri temsil etmek için farklı yollar vardır. Unicode aynı karakterin tüm temsiller tür bir Kovansız karşılaştırma yapmak için küçük harfle iki dizeleri ezmek gibi, tek bir gösterim dönüştürülür hangi "canonicalisation" kavramı vardır.

Linux böylece bir dosya karakterleri veya ikisinin karışımını (iki bayt dizisi gibi) önceden bestelenmiş ile adlandırılmış veya (üç bayt dizisi gibi) çürümüş olabilir, dosya adları için otomatik canonicalisation veya başka herhangi bir işlem yapmaz, o kim kalmış adlı dosyayı. Eğer dosyaları oluştururken, bir politika seti (örneğin her zaman önceden bestelenmiş karakterleri kullanabilirsiniz) ve onu zorlamak için bazı kod yazabilirsiniz. Aksi takdirde, burada herhangi bir kural güvenemez.