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

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

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

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

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

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

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


person Jorre    schedule 23.06.2011    source источник
comment
Попробуйте указать параметр charset   -  person Robik    schedule 23.06.2011
comment
Какую кодировку символов вы используете?   -  person GordonM    schedule 23.06.2011
comment
Какой набор символов определен для вашей страницы?   -  person Stefan Gehrig    schedule 23.06.2011
comment
Вам следует использовать htmlspecialchars, если вы просто хотите заменить специальные символы HTML.   -  person Gumbo    schedule 23.06.2011
comment
передача кодировки символов в качестве параметра помогла, как и использование htmlspecialchars, спасибо, ребята   -  person Jorre    schedule 23.06.2011


Ответы (4)


Вы пробовали использовать 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/

person sdolgy    schedule 23.06.2011

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

echo htmlentities($data, ENT_COMPAT, 'UTF-8'); 
person Dan    schedule 23.06.2011
comment
это тоже работает, но мы уже нашли ответ выше. Спасибо за помощь! - person Jorre; 23.06.2011

PHP довольно ужасен с точки зрения поддержки международных наборов символов во всем фреймворке (хотя он постепенно улучшается, особенно в PHP5, но вы не указываете, какую версию вы используете). Однако есть несколько 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">
person Jon Grant    schedule 23.06.2011

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

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

person Kerrek SB    schedule 23.06.2011