2012-12-05 11 views
6

Bir sayfada bir veri feed'i görüntülemeye çalışıyorum. Tuhaf bir karakterle kodlama sorunları yaşıyoruz. Bazı nedenlerden dolayı, feed'de U+FFFD karakter var. Ve htmlentities() karakterden kaçmayacak, bu yüzden el ile değiştirmem gerekiyor.PHP: Bir değişiklik yapmak için U + FFFD nasıl kodlanır?

aşağıdaki denedim (PHP 5.3 kullanıyorum): Yukarıdaki çalışmanın

$string = str_replace("\xFFFD", "_", $string); 
$string = str_replace("\XFFFD", "_", $string); 
$string = str_replace("\uFFFD", "_", $string); 
$string = str_replace("\x{FFFD}", "_", $string); 
$string = str_replace("\X{FFFD}", "_", $string); 
$string = str_replace("\P{FFFD}", "_", $string); 
$string = str_replace("\p{FFFD}", "_", $string); 

Hiçbiri.

Bu sayfayı okuduktan sonra - http://php.net/manual/en/regexp.reference.unicode.php - Ne yaptığımdan emin değilim. PCRE'ye UTF-8 desteğini derlemem gerekir mi? Bunun yerine böyle

+1

[Bu yardımcı olabilir] (http://stackoverflow.com/questions/4766778/how-to-encode-ufffd-in-order-to-do-a-replace?rq=1) farklı bir dil ama çok benzer sonucu – Dale

+1

Ayrıca [preg_replace] (http://php.net/preg_replace) işlevini kullanarak str_replace işlevini kullanmayın regex kullanmıyor – Dale

+0

@redolent, Guys, stop [U + FFFD 'karakterini kötüye kullanma] (http: // ** ** olması gerekmediği için stackoverflow.com/questions/4766778/how-to-encode-ufffd-in-order-to-do-a-replace#comment44707644_4766778). – Pacerier

cevap

6

Kullanım preg_replace:

$string = preg_replace('@\x{FFFD}@u', '_', $string); 
Çoğu durumda bir şey denendi gerçek bir metin karakteri ama bir işareti olması gerekiyordu içinde orijinal sorunu çözmek için gayret
9

, FFFD (unicode replacement character) değil bir UTF kodlamasında çözülür, ancak bir şey aslında bir UTF kodlamasında kodlanmamıştır. Geçersiz baytları sessizce atmak ya da kod çözme işlemini tamamen durdurmak için bir alternatiftir, her iki durumda da, bir hata oluştu.

Orijinal karakterin ne olduğunu bilmenin bir yolu yoktur. Özellikle çözümünüzle, karakteri _ ile değiştirdiğinizden, orijinal kaynağın yanlış çözüldüğünü bile bilemezsiniz. Kaynağa geri dönmeli ve doğru şekilde çözmelisin.

Not: Bir kaynak metnin örneğini, örneğin söz konusu olduğunda, normal bir karakter olarak kullanması mümkündür ve bu durumda hata yoktur. Cevabımdaki bu olasılığı hariç tutuyorum.

+0

Eh, " " * * kendi başına "gerçek" bir karakter ... :) Ama evet, OP'in görmezden geldiği bazı kök problemler olduğunu kabul ediyorum. +1 – deceze

+0

@deceze iyi, normal metin karakteri değil, ama ne demek istediğimi biliyorsun? – Esailija

+0

Eh, bu * gerçek, normal bir metin karakteridir. Tıpkı ☃ ve 風 gibi gerçek karakterler. Sadece özel durumlarda kullanılır. :) – deceze