UTF-8 &

4 Cevap php

Ben birkaç dil desteği ve tarayıcı tarafından istenen dil kullanmaya çalışır ve de bu fonksiyonun manuel geçersiz kılma sağlar yerde bir işlevselliğe sahip bir uygulama üzerinde çalışıyorum. Bu kısmı iyi çalışır ve doğru şablonları, etiketleri, vb alır

Kullanıcı kendi bazen metin girmek zorunda ve ben sorunları çalıştırmak nerede uygulama Çince ve Rusça gibi hatta "karmaşık" dilleri kabul etmek zorunda çünkü. Şimdiye kadar diğer nakil, yani bahsedilen şeylerin hallettim:

  • çağrı mb_internal_encoding( 'UTF-8' )
  • ile web sayfalarını işlerken doğru kodlamayı ayar meta http-equiv=Content-Type content=text/html;charset=UTF-8 (format sınırlamaları StackOverflow nedeniyle uyarlanmış)
  • Çünkü mb_detect_encoding() == UTF-8, hatta içerik doğru geldi
  • Birkaç desteklemek zorunda çünkü ben belirtemez bir dil, seçimi gerektirir çünkü çalışmak için görünmüyor ki, setLocale(LC_CTYPE, "UTF-8") ayarlamak çalıştı. Ve hala ben test amaçlı el zorlarsanız, yani başarısız; setLocale(LC_CTYPE,"zh__CN.utf8") - ctype_alpha() hala Çin metni için başarısız olur

Hatta açık dil seçimi ctype_alpha() kullanışlı yapmaz gibi görünüyor.

Dolayısıyla soru şudur: how should I check for alphabetic characters in all languages?

Ben şu anda sahip tek fikir "geçerli" karakter dizileri ile manuel kontrol etmektir - ama bu, özellikle Çinliler için çirkin görünüyor.

Bana bu sorunu çözmek nasıl iletebilirsiniz.

Çok teşekkürler!

4 Cevap

Ne olursa olsun kullanılan dilin sadece geçerli unicode harf kontrol etmek isterseniz ben (senin pcre-regex uzatma unicode desteği ile inşa edilmiş ise) düzenli bir ifade kullanmayı teklif ediyorum:

// adjust pattern to your needs
// $input needs to be UTF-8 encoded
if (preg_match('/^\p{L}+$/u', $input)) {
    // OK
} else {
    // not OK
}

Özelliklerini Ll (küçük harf), Lm (değiştirici içerir L (etter) özelliği ile unicode karakterler için \p{L} çekler mektup), Lo (diğer harf) Lt (başlık harf) ve Lu (büyük harf) - from: Regular Expression Details .)

Ben karakter bir dizi kullanmak olmaz. Bu yönetmek imkansız olacaktı.

Ne öneririm IP adresinden bir 'default' dili dışında çalışan ve bir istek için yerel ayar olarak o kullanıyor. Ayrıca bazı durumlarda tarayıcı aracı dizesi onu alabilir. Eğer kullanıcı varsayılan doğru değilse onlar garip bir site ile sıkışmış değil böylece geçersiz kılmak için bir yol sağlayabilir. (Örneğin form üzerinde sağlamak 'ingilizce set dil bu doğru değilse, lütfen değiştirin:.'. Bu sağlamak için güzel bir şey değil ama bir dil / yerel İHTİYACINIZ olarak başka herhangi bir çalışma doğrulama almazsınız mantıklı bir alfa doğrulama (An çince bir mektup değil) olması için ayarlayın.

Sen dillerini kullanabilecekleri

$_SERVER['HTTP_ACCEPT_LANGUAGE']

Bu gibi bir şey içerir

de-de,de;q=0.8,en-us;q=0.5,en;q=0.3

bu yüzden bu dizeyi ayrıştırmak gerekir. Sonra setLocale fonksiyonu tercih edilen dili kullanabilirsiniz.

Bu oldukça bir dil algılama sorunu daha bir kodlama konudur. UTF-8 Unicode karakteri kodlamak Çünkü.

En iyi yaklaşım, proje boyunca UTF-8 kullanmak için: veritabanındaki, sizin çıkış ve giriş için beklenen kodlama olarak.