farklı php kodlamaları

  1. Yazarlar
  2. x64 (aka andi)

acemi senaryo yazarları kodlama gibi bir şeyi umursamıyor

acemi senaryo yazarları kodlama gibi bir şeyi umursamıyor. Bu nedenle, sitelerde bazen veritabanından veri bir kodlamada elde edildiğinde, sayfa başka bir şekilde oluşturulur ve sunucuya üçüncü verilirken korkunç bir karmaşa bulabilirsiniz. sonuç olarak, sayfanın şifresi çözülebilirse, en az 2 kez. Öyleyse, neden böyle bir sorun oluyor ve bunun üstesinden nasıl gelinir?

Rus segmentinde en sık rastlanan pencereleri şifrelemeyi bulabilirsiniz. farklı şekilde adlandırın: windows-1251, cp1251 veya hatta ansi. sonraki utf-8. Unicode adını da bulabilirsiniz, ancak Unicode tüm grubun genel ismi olduğundan tam olarak doğru değil (utf-8, utf-16, utf-32). ve çok popüler bir nadirlik bir kez popüler Linux kodlaması koi8-r ya da basitçe koi-8'dir. Tabii ki, Rus segmentinde başka bir şeyle tanışmak mümkündür, ama bu yazar tarafından bir “hoşgörü” dür.

Utf-8 ve diğerleri arasındaki temel fark (öncelikle windows-1251 ve koi8-r) son bir bayt'tır ve bu kodlamaları kullanarak gösterilebilecek azami karakter sayısı 256 ile sınırlıdır. yeterli olmayabilir. ve html için bir çözüm bulundu - sözde anımsatıcı kullanımı. örneğin:

© - & kopyala;

Bu karakterlerin her birinin bir grup karakter tarafından tanımlanması gerçeğine ek olarak, kod okunamaz hale gelir ve metinle çalışma daha karmaşık hale gelir. Burası multibyte utf-8'in kurtarmaya geldiği yer. bir metinde farklı alfabelerden ve farklı sembollerden harflerin kullanılması çok uygundur.

Bu nedenle, en rahat başlangıç ​​koşulları kümesi aşağıdaki gibidir: veritabanının kodlaması, php komut dosyaları ve html sayfaları / js komut dosyaları aynı olmalıdır. Tabii ki, farklı olanları kullanabilirsiniz, ancak bu durumda kafanın karışması riski vardır. hangi kod sayfasının kullanıldığı önemli değildir. site sadece Rusça konuşulan bir kitleye yönelikse, windows-1251 yeterli olacaktır. Aksi takdirde, utf-8 mantıklı bir seçim olacaktır. ilk seçenek az çok net. multibyte kodlaması bazı hareketler gerektirecektir.

Utf-8 ile çalışırken, standart bir not defteri not defteri işe yaramaz ! Gerçek şu ki, bu editör, bu kodlamada bir dosyayı kaydederken, bir dosyayı açarken kodlamayı belirlemek için kullanılabilecek bom (bayt sırası işareti) adı verilen 3 karaktere bir imza ekler. başka bir editör seçmek daha iyidir: notepad2 veya not defteri ++ . ayarlarında imzasız kaydetmeyi seçmeniz gerekir.

Bir sonraki önemli adım veritabanı ile çalışmaktır. Taban / tablo / metin alanının kodlamasının kodlama kodlamasıyla eşleşmesi oldukça arzu edilir (cp1251 veya utf-8 veya başka bir şey olabilir). Veritabanındaki veriler "zyuk" biçiminde elde edilirse, büyük olasılıkla bağlantının kodlanması veri tabanında depolanan verilerden farklıdır. Aşağıdaki sorgu, durumun üstesinden gelmeye yardımcı olacaktır (veritabanına bağlandıktan hemen sonra çalıştırılacak):

site windows-1251 kullanıyorsa, belirtmelisiniz - cp1251.

Genel olarak, zor bir şey yok. yalnızca standart php işlevleri, çok baytlı dizelerle çalışmak üzere tasarlanmamıştır. ancak durumu düzeltmeye yardımcı olacak standart kütüphaneler var: iconv ve mbstring . Düzenli ifadeler için, değiştirici u ile etkinleştirilen gerekli bir anahtar da vardır.

Eh, veritabanından veri elde edilir, komut dosyaları tüm kurallara göre yazılır. Doğru başlığı göndermek ve kullanıcının tarayıcısında sayfa kodunu görüntülemek için kalır. başlığı göndeririz:

başlık ('Content-Type: metin / html; charset = utf-8');

Tek baytlı kodlama kullanılırsa, karakter kümesi için değer farklı olacaktır - windows-1251 . Bundan sonra, sorunlar kalmamalı.

PHP'de utf-8 ile çalışmanın basit örnekleri:

örnek 1: iconv, satır başına karakter sayısı

$ s = 'string'; # utf-8'deki dize $ cnt1 = strlen ($ s); # $ 12 değerini içerecektir cnt2 = iconv_strlen ($ s, 'UTF-8'); # doğru değer, 6

örnek 2: mbstring, bir dizedeki karakter sayısı

$ s = 'string'; # utf-8'deki dize $ cnt1 = strlen ($ s); # $ 12 değerini içerecektir cnt2 = mb_strlen ($ s, 'UTF-8'); # doğru değer, 6

örnek 3: normal ifadeler, arama ve değiştirme

$ s = 'Dize'; # utf-8 $ s içindeki satır = preg_replace ('/ p / i', 'd', $ s); # değiştirme olmayacak $ s = preg_replace ('/ p / iu', 'd', $ s); # sonuç word dock

i değiştiricisi büyük / küçük harfe duyarlı olmayan bir arama yapar ve u değiştiricisi normal ifade motoruna utf-8 dizeleriyle çalışmasını söyler.

Birisi php utf-8 ile çalışamaz diyorsa, bu yanlış olacaktır. Birkaç yıldır bu kodlamada tüm projelerimi yapıyorum ve hiçbir problem yaşamadım. Arama motorları kendileri uzun zamandır bu harika kodlamayı kullandılar.

Yazarlar

çevrimdışı 11 saat

x64 (aka andi)

Yorumlar: 2846 Yayınlar: 395 Kayıt: 02-04-2009

Öyleyse, neden böyle bir sorun oluyor ve bunun üstesinden nasıl gelinir?