Ben multi-byte yüklenmeyi (mbstring.func_overload) kullanmalı mıyım?

2 Cevap php

Ben PHP site Unicode farkında yapma sürecinde yaşıyorum. Herkes kendi multi-byte eşdeğerleri ile normal bir dize fonksiyonlar (örneğin strlen) yerine mbstring.func_overload ayarı ile deneyime sahiptir merak ediyorum (mb_strlen) . PHP kılavuzu sayfasında herhangi bir yorum yok.

Ben farkında olmalıdır olası sorunları var mı? Multi-byte sürümünü çağıran herhangi bir vaka kötü bir fikir mi?

Ben onlar yerine karakter dizeleri daha bayt dizeleri ile başa çıkmak için beklediğiniz beri bir örnek, şifreleme ile anlaşma fonksiyonlar olurdu herhalde.

Ayrıca, manuel sayfa bir not içerir: "Bir üretim ortamında yeterince kararlı ve tanımsız davranışa yol açabilir henüz teyit değil çünkü, dizin başına bağlamda seçeneği aşırı yükleme işlevi kullanmak için tavsiye edilmez."

O bir dizin bağlamında istikrarlı değil, ya da genel olarak sağlam değil anlamına mı geliyor? Ifadeler belirsizdir.

2 Cevap

kesinlikle için izlemek gereken bir konu 3 parti komut işlevleri olmayan mb-farkında sürümlerini kullanan (belki de bir kütüphane ya da armut uzatma) 'dir. Eğer aşırı eğer kullanabilirsiniz Örneğin kütüphaneler strlen() sorunlarına neden olabilir.

yanı sıra, bu bug report mb_overloaded fonksiyonları sanal konak kanama 5.2/5.3 CVS sürümlerinde giderilmiştir olduğunu göstermektedir. bug dizin başına yapılandırmaları özgüdür.

Benim cevabım: definitely not!

Sorun, onlar aşırı bir kez str * işlevleri "reset" için kolay bir yolu olmasıdır.

Bir süredir bu proje ile iyi çalışabilir, ama neredeyse kesinlikle dize işlevlerini kullanan harici bir kütüphane haline çalışacak, örneğin, bir ikili protokolü uygulamak, ve onlar başarısız olur. Onlar başarısız olur ve onlar başarısız neden bulmaya çalışırken saatler geçireceksiniz.

Eğer olduğunu bulduk sonra mbstring.func_overload, çok fazla seçenek yok. Bazı tek-bayt başına karakter kodlama mbstring.internal_encoding ini_set olabilir Eğer harici kitaplık diyoruz ve hemen ardından geri ayarlayın, ancak kütüphane uygulamanıza geri aramalar yaparsa, o olacak sadece pisliği her zaman şeyler.

Başka bir seçenek onların mb_string meslektaşı tüm str * işlevleri değişen ve kodlama parametre olarak bir tek-bayt başına karakter geçen, elle kütüphane çimdik etmektir. Kolayca harici güncellemek için yeteneğini kaybeder, ve siz de bazı performans sorunlarına neden olabilir, çünkü bu, ancak, ya da harika bir fikir değildir.

Yani, yine, kullanmayın func_overload. Eğer multi-byte dizeleri ile çalışıyorsanız, uygun MB_ işlevlerini kullanın.