PHP baytlı Dizge İşlevleri

5 Cevap php

Bu doğru sonuç tabii ki 0 false bile döndü çünkü bugün ben. Bir parametre UTF-8 olarak kodlanmış çünkü bu oldu, ama diğer (menşei HTTP GET parametresi), php fonksiyon strpos () ile bir sorun koştu belli değil.

Şimdi mb_strpos işlevini kullanarak benim sorunum çözüldü fark etmişsinizdir.

Benim sorum şimdi: akıllıca gelecekte tezleri sorunları önlemek için, genellikle PHP Çokbaytlı dize işlevlerini kullanmak mı? Ben hiç, vb geleneksel strpos, strlen, Ereg, vb fonksiyonlar kaçınmak gerekir?

Uyarı: PEAR kütüphanesi kullanırken bu diğer sorunlara yol açar, çünkü php.ini içinde mbstring.func_overload küresel ayarlamak istemiyorum. Ben PHP4 kullanıyorum.

5 Cevap

Bu kullandığınız karakter kodlaması bağlıdır. Tek baytlık karakter kodlamaları, veya UTF-8 (karakter içinde bir tek bayt başka bir karakter için yanlış olamaz yer), sonra sürece sizi arıyor dize ve aramak için kullandığınız dize aynı olduğu gibi kodlama sonra normal dize arama işlevlerini kullanmaya devam edebilirsiniz.

UTF-8, diğer karakterler gibi görünen bir karakter içinde tek bir bayt engellemez başka bir multi-byte kodlama kullanıyorsanız, o zaman normal string arama fonksiyonlarını kullanarak bir dize arama yapmak için asla güvenli değildir. Sen yanlış pozitif bulabilirsiniz. Böyle strpos gibi fonksiyonları PHP'nin string karşılaştırma başına bayt olduğunu ve UTF-8 özellikle bu sorunu önlemek için tasarlanmıştır hariç, multi-byte kodlamaları bir karakter herhangi bir sonraki bayt oluşan sorun yaşayacaktır çünkü bu Birden fazla bayt farklı karakterin bir kısmını maç olabilir.

Eğer in arıyorsunuz dize ve dize farklı karakter kodlamaları vardır arıyorsanız, o zaman dönüşüm her zaman gerekli olacaktır. Aksi takdirde farklı bir diğer kodlama temsil edilecek herhangi bir dize olduğunu göreceksiniz, bu her zaman false dönecektir. Sen girdi böyle dönüşüm yapmak gerekir: app kullanacak kodlayan bir karakteri karar ve uygulama içinde tutarlı olması. Eğer farklı bir kodlama girdi almak her zaman, içeri yolda dönüştürmek

Önce 5.2 PHP sürümlerinde MB_ * fonksiyonları ile bazı sorunlar olmuştur. Kod PHP farklı sürümleri ile çoklu platformlarda oluyor Yani, garip davranış oluşabilir. Ayrıca MB_ strpos fonksiyon oldukça yavaş olduğunu, dahili olarak kullanılan gerçek bayt pozisyon almak için offset parametresi tarafından belirtilen karakter sayısını atlamak zorundadır. Döngüler strpos / mb_strpos işlevselliği bağlı olarak, bu büyük bir darboğaz haline gelebilir.

Her yerde aynı kodlamayı kullanıyorsanız genellikle bir sorun değildir. Ben bütün sayfaları için UTF-8 kullanmak, ve aslında bu sorunu hiç karşılaşmadım. Sonunda gerçekten sayfaları ve veritabanı için aynı kodlamayı belirterek aşağı gelir.

Örneğin:

header('Content-type: text/html;charset=utf-8');
mysql_query('SET NAMES utf8');

Çoğu durumda bu uygulama için tüm veri kaynakları aynı kodlama verileri teslim edecek ve böylece sorunların bu tür önlemek olacak anlamına gelir.

Tam unicode desteği-çünkü bu, tüm btw, gelişi PHP 6 ile çok daha iyi olacaktır.

Mutlaka mb_strpos kullanmak zorunda değilsiniz, ama size app tüm verilerin aynı olduğundan emin olmak gerekiyor: Bir mb_string, ya da belirli bir kodlama sade bir dizge. (Genellikle UTF-8.)

Eğer emin olun Eğer sayfaları UTF-8, ve form gönderimler UTF-8 olarak yorumlanır, ve UTF-8 veritabanı depolar, genellikle iyi olacak. (Özellikle kesikler içinde) endeksli string işlemleri can sıkıcı ama genel olarak felaket değil bir UTF-8 serisi, kırabilir. Eğer bu seviyede bir destek ihtiyacınız yoksa, mb_strings tek seçenek (ama tabii size app ve kütüphaneleri ve PHP sürümü tüm parçaları düzgün onlarla başa çıkabilir emin olmak gerekir).

PHP doğru Unicode idare edebilen siteleri geliştirme şu anda çok eğlenceli değil:., Unicode desteği, Python ve NET gibi dillere göre çok kötü. Bu PHP6 konularda geliştirmek umulmaktadır.

Ben şu PHP UTF-8 kitaplığı kullanarak tavsiye ederim:

http://sourceforge.net/projects/phputf8

Uygulama ile donatılacak Mbstring uzantısı gerekmeyen tarafından uygulamanızın gereksinimlerini gevşetir, ama yine de UTF-8 dize fonksiyonları olsun.