Sadece argüman olarak geçerli UTF-8 kodlanmış dizeleri verilmiş eğer güvenli bir UTF-8 kodlanmış bir dize kullanılabilir str_replace miyim?

4 Cevap php

PHP'nin str_replace() sadece ANSI dizeleri için tasarlanmıştır ve gibi UTF-8 dizeleri cendereye olabilir. Sadece argüman olarak geçerli UTF-8 dizeleri verildi Ancak, bu ikili güvenli olduğunu verilen düzgün çalışmak istiyorsunuz?

Edit: Ben bir yedek işlevi aramıyorum, ben sadece bu hipotez doğru olup olmadığını bilmek istiyorum.

4 Cevap

Evet. UTF-8 kasten Bu ve diğer benzeri olmayan Unicode farkında işleme izin vermek için tasarlanmıştır.

UTF-8, geçerli bir karakteri temsil eden herhangi bir ASCII olmayan bayt dizisi her zaman aralığında bir bayt ile başlar \xC0-\xFF. Bu bayt dizisinde başka bir yerde görünmüyor olabilir, böylece bir karakterin parçası eşleşen geçerli bir UTF-8 dizisini yapamazsınız.

Bu, bir bayt dizisi farklı bölümleri ayırt edilemeyen yaşlı baytlı kodlamaları için durum böyle değil. Bu Shift-JIS dize bir ASCII ters eğik çizgi değiştirmeye çalışırken, örneğin, sorunların bir sürü neden (burada byte \x5C başka bir şey temsil eden bir karakter dizisinin ikinci bayt olabilir).

UTF-8 multibyte karakterler sadece ASCII olmayan (128 + bayt değeri) karakterler takip kaç bayt tanımlayan bir bayt ile başlayan, çünkü doğru, böylece yanlışlıkla olan bir UTF-8 multibyte karakterinin bir parçası eşleşen sona eremez başka.

(Soyut) görselleştirmek için:

  • a bir ASCII karakter için
  • 2x 2-bayt karakter için
  • 3xx 3-bayt karakter için
  • 4xxx 4-bayt karakter için

Eğer eşleşen iseniz, diyelim ki, a2x3xx (a aralığındaki ASCII bayt), beri a < x, ve 2x 3xx veya 4xxx, ve saire bir alt kümesi olamaz, güvenli olabilir ki senin UTF-8 olacak Doğru eşleşen tüm dizeleri UTF-8 kesinlikle geçerli olduğu önkoşul verilen.

Edit: Bir daha soyut bir açıklama için bobince 'ın cevabı bakın.

Eh, ben do bir karşı örnek var:.. Ben UTF8 kodlanmış ayarları "sahip e-posta gönderen isim gibi ini 'dosyası belirterek appliation ayarları bir şey gibi söylüyor:

email_from = Märta

ve ben oradan değişken için okumak $sender. Şimdi ben (yine UTF8) mesaj gövdesini değiştirin ki

regards {sender}

$message = str_replace("{sender}",$sender_name,$message);

E-posta her açıdan kesinlikle doğru ancak gönderen tamamen bozuldu. Diğer durumlarda bir şey UTF dize ile yanlış gittiğinde (gibi) (patlayabilir) vardır. Bu dönüşüm önce ama ondan sonra sağlıklı. Bu davranışı düzeltmek hiçbir şekilde gibi görünüyor söylemek için üzgünüm.

Edit:. str_replace() de masum olabilir bu yüzden problem de çok fonksiyonu yalan olabilir bu yüzden Aslında, explode() ini dosyasını ayrıştırma yer almaktadır.

Evet, bu doğru olduğunu düşünüyorum, en azından ben herhangi bir karşı-örnek bulamadık.