用于php / mysql CMS的多语言用户输入的前后处理的最佳方法

时间:2009-01-28 15:10:19

标签: php mysql content-management-system filtering user-input

好的,有很多关于消毒字符串的东西,但是很少,我可以找到最好的方法来准备用户输入(比如我现在正在键入的内容),以便插入内容管理系统然后如何过滤掉它。

我正在构建两种多语言(日语,英语+其他浪漫语言)CMS,并且能够获得像®,™这样的特殊字符,并与日语字符一起显示。

我继续得到非常不一致的结果。

我将所有内容设置为UTF-8:

网页:和

.htaccess文件:AddDefaultCharset UTF-8 AND(强制解决问题)

每次数据库连接后

:mysql_query(“SET NAMES'UTF8'”);

每个数据库,表和字段也设置为utf8_general_ci

魔术报价已关闭。我首先使用htmlpurifier的默认设置预处理用户输入,然后在其上运行此函数:

function html_encode($var) {

        // Encodes HTML safely for UTF-8. Use instead of htmlentities.
        $var = htmlentities($var, ENT_QUOTES, 'UTF-8');

        // convert pesky special characters to unicode
        $look = array('™', '™','®','®');
        $safe = array('™', '™', '®', '®'); 

        $var = str_replace($look, $safe, $var);

        $var = mysql_real_escape_string($var); 

        return $var; 
                            }

将其存入数据库。

我通过使用此函数过滤所有内容从数据库返回:

function decodeit($var) {

        return html_entity_decode(stripcslashes($var), ENT_QUOTES, 'UTF-8');
                            }

不幸的是,毕竟我仍然得到不一致的结果。大多数情况下,®符号变成小钻石。

我已经搜遍了这个,但似乎无法找到最好的方法......

5 个答案:

答案 0 :(得分:1)

抱歉网页标题被wysiwyg编辑器清除了。为了清楚起见:

网页标题为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

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

答案 1 :(得分:1)

不要在数据库中放置htmlentities!永远不要调用html_entities(),它应该从php中弃用。使用htmlspecialchars但是在显示文本时,而不是在将其放入数据库之前。关键是要防止您的数据被视为html。翻译商标符号或版权符号毫无意义,因为它们不会造成风险。你唯一需要担心的是:&gt; &LT; &安培; '“

答案 2 :(得分:0)

答案 3 :(得分:0)

所有内容都已编码为utf8。将其解码为ISO-8859-1只会破坏任何日本人。

答案 4 :(得分:0)

我曾经遇到过编码问题,这个问题归结为php文件本身的编码。所以基本上确保文件本身编码为utf-8。在vim你可以做到 :e ++ enc =