htmlentities () делает китайские символы непригодными для использования

у нас есть веб-приложение, где мы разрешаем пользователям вводить собственный HTML-код в текстовой области. Мы сохраняем эти данные в нашей базе данных.

Когда мы загружаем html-данные в текстовую область, мы, конечно же, используем htmlentities (), прежде чем бросать html-данные в текстовое поле. В противном случае пользователи могли бы сохранить внутри текстового поля, и наше приложение сломается при загрузке в текстовое поле.

это отлично работает, за исключением случаев ввода китайских символов (и, возможно, других языков, таких как арабский, японский).

Htmlentities () делает китайский текст непригодным для использования следующим образом: à ¨à ³à ¼à §ÃÃ. Когда я удаляю htmlentities (), прежде чем загружать введенный html в текстовую область, китайские символы отображаются просто отлично, но тогда мы сталкиваемся с проблемой взаимодействия HTML с нашим текстовым полем, особенно когда пользователи входят в область текста.

Я надеюсь, что в этом есть смысл.

Кто-нибудь знает, как мы можем безопасно и правильно разрешить использование таких языков, как китайский, японский, … внутри нашей текстовой области, сохраняя при этом безопасность для загрузки любого html внутри нашей текстовой области?

Вы пробовали использовать htmlspecialchars ?

В настоящее время я использую это в производстве, и все в порядке.

 $foo = "我的名字叫萨沙" echo '<textarea>' . htmlspecialchars($foo) . '</textarea>'; 

С другой стороны,

 $str = “&#20320;&#22909;”; echo mb_convert_encoding($str, 'UTF-8′, 'HTML-ENTITIES'); 

Как показано на http://www.techiecorner.com/129/php-how-to-convert-iso-character-htmlentities-to-utf-8/

Укажите кодировку, например UTF-8, и она должна работать.

 echo htmlentities($data, ENT_COMPAT, 'UTF-8'); 

PHP довольно ужасен с точки зрения поддержки в масштабе всей среды для международных наборов символов (хотя он медленно становится лучше, особенно в PHP5, но вы не укажете, какую версию вы используете). Однако есть несколько mb_ ( mb_ , как в многобайтовых символах), которые помогут вам.

Этот пример может помочь вам ( отсюда ):

 <?php /** * Multibyte equivalent for htmlentities() [lite version :)] * * @param string $str * @param string $encoding * @return string **/ function mb_htmlentities($str, $encoding = 'utf-8') { mb_regex_encoding($encoding); $pattern = array('<', '>', '"', '\''); $replacement = array('&lt;', '&gt;', '&quot;', '&#39;'); for ($i=0; $i<sizeof($pattern); $i++) { $str = mb_ereg_replace($pattern[$i], $replacement[$i], $str); } return $str; } ?> 

Кроме того, убедитесь, что ваша страница указала один и тот же набор символов. Вы можете сделать это с помощью метатега:

 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 

Скорее всего, вы не используете правильную кодировку. Если вы уже знаете свою выходную кодировку, используйте аргумент html_entities функции html_entities .

Если вы еще не установили внутреннюю кодировку, взгляните на функции iconv ; iconv_set_encoding("internal_encoding", "UTF-8"); может быть хорошим началом.