Neden PHP tam unicode desteğine sahip olamaz?


18

Herkes bilir, PHP'nin Unicode ile sorunları vardır. Sürüm 6, Unicode uygulama zorlukları nedeniyle etkin bir şekilde terk edildi. Ama merak ediyorum nedenleri kesin olarak biliyor mu? Mimari / tasarım problemleri, performans kaygıları, topluluk problemleri (emin değilim), başka bir şey?

Yanıtlar:


16

Bir dil olarak PHP kesinlikle sahip olabilir, ancak sorunun mevcut programlarla uyumluluk olduğunu düşünüyorum. Unicode desteği, onları en rahatsız edici böcek türü olan ince yollarla kırabilir.

Şu anda PHP'deki dize işleme işlevlerinin çoğu "ikili-güvenli" dir, yani herhangi bir kodlamadaki herhangi bir dosyayı ve görüntü verisi gibi ikili biçimleri işlemek için kullanabilirsiniz.

Unicode dizelerinin eklenmesi ile Unicode dizelerini ikili dizelerle karıştırmamaya çok dikkat etmeniz gerekir (dizeleriniz farklı kaynaklardan geldiğinde ve daha önce hiç endişelenmeniz gerekmediğinde oldukça zor). Ve artık kodlamalar hakkında cahil olamayacaksınız (ve bu konuda çok sayıda komut dosyası cahil!)

Bir başka zor, ancak çözülebilir sorun Unicode dizelerinde rastgele erişimdir. $string[$offset]Önemsizden çok yavaş veya az yavaş ve çok karmaşık değişikliklerin uygulanması .

Ayrıca PHP için dahili kodlama olarak UTF-16 seçmek bir hata olduğunu düşünüyorum. UTF-8 (vekil çiftler nedeniyle değişken genişlik) ve UCS-2'nin verimsizliği ile aynı problemlere sahiptir. Belki de bunu hurdaya çıkarmalı ve UTF-8 ile tekrar başlamalıdırlar?

</speculation>


2
utf8'e geçiş konusunda tamamen katılıyorum.
GrandmasterB

UTF-16'nın veri yığın boyutu dışında UTF-8'den daha kötü olduğunu mu düşünüyorsunuz?
ts01

3
@Dean Harding: UTF-16 ile çalışmanın imkansız olduğunu söylemiyorum, sadece rastgele erişim ( O (1) 'de ) mümkün değil. UTF-16, 100. kod noktasının 200. baytta başlayacağını garanti etmez, bu nedenle 100. kod noktasına erişmek için öncekileri doğrusal olarak taramanız gerekir (ve iyi uygulama elbette sonucu önbelleğe alır). Bu bakımdan UTF-8'e benzer (yani n'inci karaktere / kod noktasına erişim O (1) değil O ( n ) 'dir ).
Kornel

1
@Dean: UTF-16 ve UTF-8 arasındaki harmanlama veya dönüşümler gibi şeyler, kesin olarak karakterleri birleştirmek için yaptıkları gibi aynı şekilde işe yaramaz.
dan04

3
UTF-16 (veya başka bir kodlama) yerine UTF- 8'i seçmenin nedenleri hakkında mükemmel bir özet utf8everywhere.org adresinde bulunabilir .
Joachim Sauer

11

TLDR: Birçok PHP kütüphanesi, unicode'u desteklemeyen veya birbiriyle uyumsuz şekillerde desteklemeyen yerel C kütüphaneleri üzerinde ince bir katmandır. Bu durumu düzeltmek, geriye dönük olarak uyumsuz değişiklikler getirmesi muhtemeldir.

YASAL UYARI: Birkaç yıl önce PHP'den Python'a (asla geriye bakmamak için) geçiş yaptığım için fikrim açıkça önyargılı.

Ben PHP güzel ve akıllı bir kesmek olduğunu düşünüyorum. Bir hack olarak, iddiasız başladı ve iyi düşünülmüş ve birleşik bir tasarıma sahip olmayan (bilgisayar dili teorisi perspektifinden) bir grup seyrek kütüphaneden düzensiz bir şekilde büyüdü.

Machiavelli'nin dediği gibi, "temellerini ilk atmamış olan, daha sonra onları döşemek için büyük bir yeteneğe sahip olabilir, ancak mimar için sorun ve bina için tehlike ile döşenecektir".

Bir programlama dili için, daha popüler, değiştirmek daha zordur. C gibi diller her 10 yılda bir değişir. Örneğin, Python 3 geriye doğru uyumsuz değişiklikler yaptı ve hoş değildi. Önceki Python enkarnasyonlarındaki unicode desteğinin zaten PHP'deki mevcut durumdan daha üstün olduğu düşünülüyordu, ama tahmin edin ne: Python 3'teki en polemik değişiklikler unicode kullanımı ile ilgilidir. Armin Ronacher'den gelen bu rant , Python topluluğunun büyük bir payından kaynaklanan hayal kırıklığını özetliyor.

PHP "" "her yerde bulunan web platformu olmak onu kendi başarısının kurbanı yapar. PHP'de unicode için birleşik destek kaçınılmazdır, ancak çok fazla kan, ter ve gözyaşı gerektirir.


sanırım herkes burada hemfikir. Ama ayrıntıları soruyordum;)
ts01 28:10

3
Sorun, temeldeki birçok kütüphanenin unicode'u iyi işlememesidir ve sorunu sıfırdan başlamadan çözmek çok zordur.
Paulo Scardine

(fyi, "birkaç yıldan beri", PHP daha iyi ve Python daha da kötüleşti)
ZJR

1
@ZJE: Bilmek güzel, teşekkürler. Bana bu değişiklikle ilgili bazı referans materyalleri gösterecek kadar nazik misiniz?
Paulo Scardine

6

Eski PHP 6 çalışmasının durdurulmasının başlıca nedenlerinden biri, getirdiği iç karmaşıklık ve yapılacak iş miktarından kaynaklanıyordu;

Biraz tarih: PHP 6'nın Unicode imlementation, daha büyük bir PHP kullanıcısı tarafından tasarlandı ve Unicode "doğru" yapmaya çalıştı. Bazı değerlendirmelerden sonra PHP'nin Unicode desteğinin birincil tasarımcısı, dahili olarak Utf-16 olan yeni bir dize türü eklemeyi ve farklı yerlerde farklı şifrelemelerin kullanılmasına izin vermeyi seçti. Bu nedenle kod bir kodlamada yazılabilir, çıkış farklı bir kodlama ve başka bir kodlama "runtme işlemleri" kullanabilir. UTF-16'yı seçmenin nedeni, çalışmanın UTF-16 kullanan ICU geçim kaynağına dayandırılmasıydı ve utf- ve utf-16 arasındaki dönüşüm nispeten ucuzken, bu kodlamanın ortak dize işlemlerini hızlı bir şekilde yaptığı bulundu. . Çok uzak çok iyi.

Şimdi bunu yapmanın sonucu, her şeyden önce yeni bir dize türünün girişidir. PHP'nin dahili tip sistemi o zamana kadar birkaç tipe (NULL, bool, int / long, float / double, string, dizi, kaynak, nesne) sahipti ve çok sayıda kod bu durumda bazı varsayımlara sahipti. Bu varsayımların yanı sıra, dizeler üzerinde çalışan tüm işlevler ve bunların birçoğu bireysel olarak değerlendirilmeli ve kodlamaların nasıl ele alınacağına karar verilmelidir. İkili veya unicode dizgiler üzerinde mi çalışmalılar? Eğer bir kodlama gerekiyorsa hangi kodlama kullanılmalıdır vs. ve bu çok fazla iştir ve bazı durumlarda doğru yapmak oldukça karmaşıktır. Ek olarak, dahili API'ler oldukça karmaşık hale geldi, çünkü PHP'deki anahtar API'lerin çoğu ikili dizeler (eski) için sürümler ve daha sonra genellikle "çalışma zamanı kodlu" dizeler için bir sürüm,

Birçok geliştiricinin coplexity üzerinde tökezlediğini, utf-16 tarafından rahatsız edildiğini ve bunun iki kat bellek kullanımından daha fazla olacağını ve çoğu mevcut uygulamayı kırırken dizeleri dönüştürmek için çok fazla zaman harcamasını sevmediğini yapma süreci boyunca. Bu yüzden, PHP gönüllüler tarafından yönlendiriliyor, daha az ve daha az geliştirici üzerinde çalışıyordu ve diğer şeyler yığıldı ve katkıda bulunanlar mutsuz oldu ve sonunda terkedilmek zorunda kaldı.

Şimdi gelecek ne getirebilir? - PHP ae içinde utf-8 etrafında daha fazla şey inşa yavaş bir evrim yaşanıyor. Özel bir tip ve her şeyi zorlamakla güçlü bir şekilde değil ve şu anda geliştiriciler bu sıcak demire dokunmaya motive değiller. Birisinin güzel çalışmasını sağlamak için iyi bir teklifi olduğunu umut edebiliriz, ancak şu anda sadece "sözcüğü duyduklarında" herkes kaçacaktır. :)


1

Asıl nedeni, PHP geliştirme ekibinin PHP geliştirme için açık bir yol haritasından yoksun olması (php-internals üzerindeki bir kişi, 5.4'ün hangi özellikleri içermesi gerektiğine karar vermeden PHP 5.4 şubesini başlatmaya karar verdiğinde oldukça sıcak bir tartışmadan bahsedelim). Bu dili çok seviyorum, ancak geliştirilme şekli beni biraz endişelendiriyor.


2
2006 yılında 5 yıl boyunca kullandıktan sonra Python için PHP'den ayrıldım - Python inanılmaz bir geliştirme sürecine ve iyi bir liderliğe sahip - ayrıca dil PHP'den çok daha keskin, güçlü ve tutarlı. Temel zorluk doğru web çerçevesini bulmaktır. Kendimizi yuvarladık - AppStruct.
gahooa

1
Peki biz PHP 6 için bir yol haritası vardı. Yardımcı olmadı;) Yol haritası sorunlarından biri PHP görünen gönüllüler tarafından tahrik (ve "iyi fikirleri" varsa biz onları tutmak ve yakında özelliklerini eklemek istiyorum) ve aniden kayboluyor (evleniyor, iş değiştiriyor, ...)
johannes

Mutlu bir şekilde PHP 7 bir başarıdır.
danger89

5 yıl sonra ve hala 'tam unicode desteği' yok :)
Mchl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.