Uluslararası dizeleri ile PHP ve MySQL en iyi uygulamaları

6 Cevap php

Genellikle MySQL DB için harmanlama, tablo ve alan utf8_general_ci için ayarlanmış olsa bile, gibi karakterler é é dönüşmüş olur olur. Sayfa için Content-Type, en kodlaması UTF8 ayarlanır.

Ben utf8_encode/decode hakkında biliyorum, ama ben nerede ve nasıl kullanılacağı hakkında pek emin değilim.

Ben "The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)" makaleyi okudum, ama bazı MySQL / PHP özel işaretçiler gerekir.

Question: How do I ensure that user entered data containing international characters doesn't get corrupted?

6 Cevap

On the first look at http://www.nicknettleton.com/zine/php/php-utf-8-cheatsheet I think that one important thing is missing (perhaps I overlooked this one). Depending on your MySQL installation and/or configuration you have to set the connection encoding so that MySQL knows what encoding you're expecting on the client side (meaning the client side of the MySQL connection, which should be you PHP script). You can do this by manually issuing a

SET NAMES utf8

önce sen MySQL sunucuya göndermek başka bir sorgu için sorgu.

Yorum yok PHP tarafında PDO kullanarak eğer set-up bağlantıyı otomatik olarak her bu sorgu vermek için (yeniden) kullanarak bağlanmak

$db=new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8");

db bağlantı başlatırken.

Harmanlama ve charset aynı şey değildir. Sizin harmanlama charset eşleşmesi gerekir, böylece charset utf-8, eğer öyleyse harmanlama gerekir. Yanlış harmanlama Toplama olsa verilerinizi garble olmaz - Sadece yanlış çalışması string-comparison/sorting olun.

Yani PHP charset ayarlarını birkaç yer vardır, dedi. Ben mümkünse eğer, boyunca UTF-8 kullanmanızı tavsiye ederim. Belirtilen charset gereken yerler:

utf8_encode / kod çözme fonksiyonları garip adında küçük vardır. Bunlar özellikle latin1 (ISO-8859-1) ve utf-8 arasında dönüştürebilirsiniz. Uygulamanızda şeyi utf-8 ise, onları çok kullanmak zorunda kalmazsınız.

Utf-8 ve PHP ile ilgili en az iki gotchas vardır. İlk PHP'nin yerleşik string fonksiyonları dizeleri tek bayt olmasını bekliyoruz olmasıdır. Operasyonları bir sürü için, bu önemli değil, ama size strlen and other functions. There is a good run-down of the limitations at this page güvenemez daha gelir. Genellikle, bu büyük bir sorun değil, ama 3-parti kütüphaneleri kullanarak, özellikle zaman, işler bu kadar darbe olabilir farkında olmak gerekir. Bir seçenek utf-8 farkında alternatifleri ile tüm zahmetli fonksiyonlarını değiştirmek için seçeneği vardır mb_string uzantısını kullanmak için aynı zamanda. Hala% 100 kurşun çözüm değil, ama çoğu için çalışacağız.

Bir diğer sorun PHP bazı tesisler hala magic_quotes ayarının açık olmasıdır. Bu sorun, UTF-8 ortogonal olan, ancak bazı kafa çizilmeye yol açabilir. Kendi aklı aşkına, onu kapatın.

Yapmanız gerekenler:

  • Emin Apache UTF-8 içeriği koysun. Httpd.conf bunu, ya elle bunu yapmak için PHP'nin header () işlevini kullanın.
  • Veritabanı bağlantısı UTF8 olduğundan emin olun. "İSİMLERİ SET utf8" hile yok.
  • Tüm tablolar UTF8 için ayarlanmış olduğundan emin olun.
  • Eğer onları uluslararası karakterleri depolamak, tüm PHP ve şablon dosyaları UTF8 olarak kodlanmış olduğundan emin olun.

Genellikle bunu yaparken çok mb_string veya utf8_encode/decode-functions kullanarak yapmak zorunda değilsiniz.

Çok değil, bu makalenin konusu olmadığını söyledi gerekir

http://developer.loftdigital.com/blog/php-utf-8-cheatsheet

(Dokümantasyon farklar hakkında biraz muğlak olsa) iyi unicode doğruluğu için, utf8_unicode_ci kullanmalısınız. Ayrıca, aşağıdaki MySQL bayrakları doğru ayarlanmış olduğundan emin olun -

  • = utf8 default-character-set
  • skip-character-set-client-el sıkışma / / Önemli böylece istemci başka bir kodlama zorunlu kılmaz

Bunlar uygun sorguları göndererek ([mysqld] sekmesi altında) ya da çalışma zamanında mysql yapılandırma dosyasında ayarlanabilir.

Ne olursa olsun parçalar halinde ele, kodlamaları geniş bir yelpazede sağlayan bir uygulama oluşturmak için olsaydı, ile yazılmış dili:

  • Identify the encoding
    • nasılsa aksi takdirde, daha da bunu dikkate için oldukça anlamsız uğraşıyoruz kodlama ne tür, öğrenmek istiyorum. Sen önemsiz karakter ile bitireceğiz.
  • Handle your bytes
    • Daha az karakter 'dizeleri' gibi bu dizeleri düşünüyorum, ve daha bayt listeleri gibi
    • PHP özellikle sinsi olduğunu. On-the-fly veri kesecek izin vermeyin. Eğer bir UTF-8 dizesi regexing ediyorsanız, emin olun o şekilde tanımlamak yapmak
  • Store for the LCD
    • Yine, veri kesecek istemiyorum. İngilizce bir cümle saklıyorsanız, siz de Mandarin glyphps bir dizi saklayabilirsiniz? Ne Arapça ne dersiniz? Bunlardan hangisi en fazla alan gerektiren gidiyor? Bunun için hesap.