htmlentities () делает китайские иероглифы непригодными - PullRequest
5 голосов
/ 23 июня 2011

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

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

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

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

Надеюсь, это имеет смысл.

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

Ответы [ 4 ]

5 голосов
/ 23 июня 2011

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

2 голосов
/ 23 июня 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">
2 голосов
/ 23 июня 2011

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

echo htmlentities($data, ENT_COMPAT, 'UTF-8'); 
0 голосов
/ 23 июня 2011

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

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

...