Warum gibt esc_html () bei einem String, der ein High-Bit-Zeichen enthält, nichts zurück?

In PHP 5.2 bereinigt filter_var () Text. In WP bereinigt esc_html () Text. Ersteres arbeitet mit einem High-Bit-Zeichen in der Textzeichenkette, zB à, aber letzteres nicht. esc_html scheint eine Zeichenkette zu essen, die einen High-Bit-Charakter enthält. Hier ist das Beispiel, geschrieben als einfaches WP-Plugin:

 
<?php $ts = 'blah à blah'; echo "original: " . $ts . "
" ; echo "PHP sanitized: " . $this->sanitize_txt( $ts ) . "
" ; echo "WP sanitized: " . esc_html( $ts ) . "
"; die(); ?>

Hier ist die Ausgabe:

original: blah blah
PHP saniert: blah à blah
WP saniert:

Ich bin nicht besessen davon, esc_html () zu benutzen. Wenn ich stattdessen filter_var () verwende, verschwindet die Zeichenfolge, wenn ich sie einem benutzerdefinierten WP-Feld hinzufüge. Irgendwie tötet WP sanitation die Zeichenfolge.

Ich bin verwirrt. Wäre dankbar für einen Hinweis.

Solutions Collecting From Web of "Warum gibt esc_html () bei einem String, der ein High-Bit-Zeichen enthält, nichts zurück?"

Vielleicht, weil die Entität ein Nicht-UTF8-Zeichen ist?

Hier ist, was esc_html() tut:

 function esc_html( $text ) { $safe_text = wp_check_invalid_utf8( $text ); $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES ); return apply_filters( 'esc_html', $safe_text, $text ); } 

Wenn nicht, dann wird es _wp_specialchars() , wenn es nach _wp_specialchars() gefiltert wird, was eine doppelte Kodierung (standardmäßig, nein) und alle möglichen Dinge bewirkt.

Als Referenz:

1) esc_html() in der Quelle

2) _wp_specialchars() in der Quelle

Die Verwendung der PHP-function filter_var () mit geeigneten Filtern ermöglicht es, den bereinigten Text in das Metafeld einzufügen. Was mit esc_html passiert, scheint ein obskures Zeichencodierungsproblem zu sein.

WordPress 3.2 benötigt PHP 5.2. Also, wenn Sie Probleme mit der WP esc_html () – function haben, ist PHP 5.2 filter_var eine gute Alternative.