2012-06-26 13 views
5

Używanie zarówno htmlspecialchars, jak i htmlentities powoduje puste wyniki z elementów takich jak symbol , a nawet pojedyncze cytaty z '. Oczywiście, jest to absolutnie bezużyteczne, jednak wyprowadzenie danych bez użycia znaków html powoduje, że ten symbol dotyczy zarówno . Jakiś powód, dla którego to się dzieje?htmlspecialchars outputting blank

tutaj jest kod, który jest przyczyną problemu:

<p> 
<?php 
    echo nl2br(htmlspecialchars($aboutarray[0]['about_us'], ENT_COMPAT, "UTF-8")); 
?> 
</p> 
+2

Brzmi jak problem z zestawem znaków. Czy jesteś pewien, że twoje dane są zakodowane w UTF-8? –

+0

Być może nie rozumiem twojego problemu, ale próbowałem go na ideone.com i wygląda na to, że działa dobrze: http://ideone.com/P298n –

+0

@ EmilVikström Jak mam się tego upewnić? – JimmyBanks

Odpowiedz

13

Ten ciąg nie jest kodowany w ważnej kodowania UTF-8. Może być w innym kodowaniu takim jak UTF-16 lub może zawierać tylko binarne śmieci, które nie odpowiadają żadnym formatom.

Najważniejsze jest to, że ponieważ określiłeś "UTF-8" jako parametr typu kodowania htmlspecialchars(), zwrócony zostanie pusty ciąg znaków, jeśli ciąg nie jest zgodny z "UTF-8". Podaje to w PHP manual.

Prostą poprawką jest użycie flagi zastępczej lub ignorowania. Zmiana:

htmlspecialchars($aboutarray[0]['about_us'], ENT_COMPAT, "UTF-8") 

Do:

htmlspecialchars($aboutarray[0]['about_us'], ENT_COMPAT|ENT_SUBSTITUTE, "UTF-8") 

Lub:

htmlspecialchars($aboutarray[0]['about_us'], ENT_COMPAT|ENT_IGNORE, "UTF-8") 

Uwaga: ENT_IGNORE usuwa bajtów niezgodnych. Może to spowodować a security issue. Lepiej dobrze zrozumieć treść łańcucha i jego kodowanie. Popraw źródło problemu, zamiast używać prostej poprawki ENT_IGNORE.

Należy zadać sobie dlaczego ciąg nie jest kodowany w UTF-8 ... to powinny być, ale tak nie jest.

Tak się złożyło, że właśnie napotkałem ten problem; możesz przeczytać szczegóły na temat tego, dlaczego zwracany jest pusty ciąg znaków: here.

+1

P.S. Sugerowałbym również zmianę ENT_COMPAT na ENT_QUOTES, ale jak zwykle przypuszczam, że zależy to od konkretnego scenariusza. – Lakey

+1

doskonałe rozwiązanie. – Centurion

+1

Ta odpowiedź czyni mój dzień ... Dzięki – emaniacs

Powiązane problemy