Hangi faktörler PHP Unicode-uyumsuz yapmak?

6 Cevap php

Ben komut dosyalarında mümkün kullanımı UTF-8 karakterler sadece iyiyim.

Nitekim olarak, have names of variables and functions contain Unicode characters mümkündür.

Orada mb_string extension multi-byte dizeleri ile ilgilenir de, henüz sayısız makalelerde PHP Unicode desteği eksikliğine için eleştirilmektedir.

Ben alamadım; neden PHP Unicode desteği değil söyleniyor?

6 Cevap

PHP birkaç yıl önce başladı zaman, UTF-8 gerçekten desteklenmiyor. Biz Windows 98/Me gibi Unicode olmayan OS hala geçerli olduğunu ve Delphi gibi diğer büyük dilleri de Unicode olmayan olduğu bir zamanda bahsediyoruz. Tüm diller gün 1 Unicode düşünülerek tasarlanmış, ve tamamen bir sürü şey bozmadan Unicode'a dilinizi değiştirerek zor edilmiştir. Java veya C # gibi diğer diller Gün 1 Unicode tasarlanmış iken Delphi, örneğin yalnızca bir ya da iki yıl önce uyumlu Unicode oldu.

PHP büyüdü ve PHP 3, PHP 4 ve artık PHP 5 olunca Yani, sadece kimse Unicode eklemeye karar verdi. Neden? Utf8_de/encode ve mb_string zaten var ve iş çünkü muhtemelen mevcut komut veya uyumlu tutmak için. Ben emin bilmiyorum, ama ben şiddetle organik büyüme ile ilgili bir şey olduğuna inanıyorum. Özellikler sadece varsayılan yoktur, onlar birisi tarafından yazılmış olması, ve bu sadece henüz PHP için olmadı.

Düzenleme: Tamam, ben yanlış soruyu okuyun. Soru şu: Nasıl dizeleri dahili olarak depolanır? Ben Kodlama kullanılan bayt oluşturmak için kullanılan "Währung" veya "ecriture" yazarsanız? PHP durumunda, bir CODEPAGE ile ASCII. Bunun anlamı şudur: Ben ISO-8859-15 kullanarak dize kodlamak ve bazı çince kod sayfası ile deşifre ederseniz, garip sonuçlar alabilirsiniz. Hiçbir kod sayfası artık, ve teorik olarak bunu yapamazsınız pisliği: Alternatif herşey demektir Unicode olarak depolanır C # veya Java gibi dilde. I Joel's article Unicode hakkında ve Karakter Setleri tavsiye ama aslında aşağı kaynar: Nasıl dizeleri dahili olarak saklanır ve PHP ile cevap "Unicode değil", sen çok dikkatli olmak zorunda ve anlamına gelir açık, her zaman giriş, depolama (veritabanı) esnasında uygun kodlama dize tutmak ve çok hataya yatkın bir çıkış, emin olmak için dizeleri işlerken.

i ölçüde kültürel bir zorluk değil, teknik bir olduğuna inanıyorum.

teknik sorunlar --- ve 'bir karakter bir byte' eşittir varsayımlar üzerine inşa edilmiş bir ekosistem unicode uygulamak için onun düpedüz tüm önemsiz değil gibi --- geliştiriciler Java veya Python çabalarının çok (son kopyalanan olabilirdi çevresinde 2001 yılından beri iyi ve büyük ölçüde çalışma unicode uyumlu), ama yapmadım.

i the discussion thread attached to the official, current documentation for php's utf8_encode() fonksiyonu okurken, ben vertigo bir duygu olsun.

firstoff, bu işlev utf8_encode() denir; Ancak, belgeler beklediği dize (aka latin-1) ISO-8859-1 olması bekleniyor belirtiyor. o sooo 80s var, sooo php bulunuyor.

En Commenters bir yük olarak unicode algılıyor gibi görünüyor. Orada karışık kodlamaları ile s'strings ile nasıl başa 'bilinmeyen içeriği' dizeleri dönüştürmek için kaç önerileri, '(wtf?), ya da ötesinde çünkü normalde kırılmasına neden codepoints ile ilgili bu işlevi dört-bayt başına codepoint sınırı.

tartışma karalamalar kurtulmak veya bu işlevin davranışı sorunlu bölümlerini önlemek için fixups etrafında merkezli. ve bu, benim için, sooo php: herkes sadece düzeltmeleri yapıyor, birkaç şey bir temelde doğru bir şekilde uygulanmaktadır. Bu benim tarafımda iftira olduğuna inanırsanız, burada bazı çerez vardır:

Bu belge zaten UTF-8 ise [aou] Alman Umlaute kırmak gibi görünüyor olsa da.

(UTF-8 anlamak için başarısızlık iki kez uygulandığında çalışmak üzere tasarlanmış değildir)

UTF8 içine 8859 ve korkunç 1252 dönüştürmek için bir yol sunar iconv () fonksiyonu, bak

(Iyi noktası: php geliştiriciler bölümünde önceki teknikte ihmaline yerine, adamcağız kendi uygulama)

utf8_encode ihtiyaç olup olmadığını tespit etmek preg_match kullanımı [...] suretler hariç [...] overlongs hariç

(utf8_encode() kırmak istemem sadece bu şeyleri bırakarak, sessizce dizeleri tüm sorunlu içeriği silmek için düşündüren;) Bu metinler okunamaz hale (veya tamamen yok olabilir, ama hey, artık hata iletileri)

bir dize kodlamak için sadece değil henüz UTF-8 [...] mb_detect_encoding($s, "UTF-8") if

(Belirttiği gibi by another commenter, bu işe gitmiyor:

$str = 'áéóú'; // ISO-8859-1
mb_detect_encoding($str, 'UTF-8'); // 'UTF-8'
mb_detect_encoding($str, 'UTF-8', true); // false

işte biz başka bir yerini bir hata bakıyoruz. mutlu avcılık. Ayrıca, ne burada önermek gibi görünüyor (yavaş, belirsiz)) edebilmiş gelir ve mekanik (hızlı, bazı) gelir ile çözülmesi gerektiğini Sezgisel yöntem kullanarak bir sorunu çözmek için

utf8_ [kodlamak | decode] belgelerine dediği gibi aslında nereden / ISO-8859-1 değil sadece, aynı zamanda windows-1252 karakter tercüme edecek

(Hiç açık ya da etraflı olması resmi php belgelere dayanmaz --- her zaman kimse hiç geri dokümanlar doyurmaya kullanıcıların yıllık tecrübesi ile okumalıdır)

Ben bir is_utf8 işlevi üzerinde çalışan ve diğerlerine ek i de dikkate aldı, burada yayınlamak istedim oldum 5000 karakter bug

(Unicode düzgün uygulanmadı çünkü büyük ölçüde, yalnızca var olan bir sorun için bir düzeltme. Biz de değil, sadece utf8_encode() function codepoint başına 4 byte ötesinde vazgeçmek olacağını öğrenmek çıkan (ya da varsa, o da kıracak çıktı?) metin) 5000 karakter sınırı aşıyor

ben bu gibi ve gidebiliriz. hepsi için, özellikle, genel olarak sağlam bir altyapı oluşturmak için gereken ne, ya da hakkında ne kodlamaları ve karakter setleri kavramak için her yerde hazır gibi bu konuya bakarsak, php topluluk sadece ses değil: Zaten fikir olsun uygun bir şekilde unicode uygulamak. Bunun yerine, onların iskeleleri, kendi kartonu, onların çivi ve çekiç kullanarak ve başka bir çivi ile geri alınamaz her sorunlara kendi kanal bant atma, php denilen bu büyük tasavvurunu inşa devam ediyoruz. Tabii, bu bina böyle ara sıra yasal ama beklenmedik bir karakter olarak, esen rüzgardan geliyor her yaşayacaktır.

Bu özel iplik sekiz yıl boyunca aktif olarak görmeye tam durum şimdi sekiz yıl daha iyi olacak güven aşılamak değildir.

Bir "multibyte karakter" kavramı, sorunun özünde.

  1. Bu bir uygulama detay sızdırıyor: Eğer uygulayıcılar verileri temsil etmek için tercih nasıl bilmeden bir karakterin soyutlama ile çalışmak gerekir - belki platforma bağlı olarak bu durumda her olduğu, UTF16 veya UTF32 gibi her şeyi temsil etmek için onlara uygun Çokbaytlı değil, karakter soyutlama kullanıcıları bakım gerektiğini.
  2. Bu bir kludge var: Hepimizin dizeleri bayt dizileri olduğunu "gerçekten biliyor" düşünce bir out-of-date alışkanlığı üzerine, biz şimdi bazen bayt Unicode karakter olarak bilinen şeyler halinde bir araya gelme olduğunu bilmek zorunda ve var özel Tüm başa yere davalar.
  3. Bir fil yemeye çalışırken bir fare gibi. ASCII bir uzantısı olarak Unicode çerçeveleme tarafından (biz de normal dizeleri var ve biz mb_strings var) o yanlış yolu çevresinde şeyler alır ve özel durumlarda birden fazla bayt gerekir komik karalamalar ile karakterler ile başa çıkmak için gerekli olan ne kadar asılı alır. Eğer ihtiyacınız olan herhangi bir karakter için soyut bir alan olarak sağlayan Unicode tedavi, ASCII özel bir durum olarak tedavi için herhangi bir ihtiyaç olmadan yerleştirilmiştir.

Bunu kendiniz söylemek: doğru çokbaytlı karakterler içeren dizeleri ile başa çıkmak için, bir uzantısı kullanmak gerekir. Yerine daha tanıdık "normal" olanlar uzatma işlevlerini kullanmak için her yerde unutun ve veri sakat olduğunu. Her yerde uzatma işlevi kullanmak için güncelleştirilmiş henüz bir üçüncü taraf kitaplığı kullanıyorsanız aynı olur.

Ayrıca, bir dizi extremely popular encodings hala açıkça not bunu yapmak ve aşağı-uyumlu kalmak imkansız çünkü tahminen, PHP tarafından desteklenir.

String fonksiyonları çoğu da bayt dizisi olarak her şeyi tedavi C kütüphanesi eşdeğerleri, etrafında sadece ince sargı vardır. Başka bir nedeni PHP gereksiz geriye dönük uyumluluk bagaj etrafında bir sürü taşır ve böylece 3 & 4 kötü tasarım kararları ile takılıyor olmasıdır.

Belki 5.3 's ad alanları ile nihayet eski işlevlerini aşamalı bir yol olacak.

Ne 'destek' ile kastedilen, 'doğal destek' dir. Detaylı bilgi almak için this bir göz atın.