2

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

我正在构建两个多语言(日语、英语 + 其他浪漫语言)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');
                            }

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

我已经到处寻找一个很好的方法,但似乎找不到最好的方法......

4

5 回答 5

1

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

于 2009-02-02T16:11:38.730 回答
1

抱歉,所见即所得编辑器清除了网页标题。为了清楚起见:

网页标题是:

<!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" />
于 2009-01-28T15:12:41.807 回答
0

一切都已经编码为 utf8。将其解码为 ISO-8859-1 只会破坏任何日本人。

于 2009-01-28T19:28:44.380 回答
0

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

于 2009-01-31T04:53:16.323 回答
0

http://us3.php.net/utf8_encode http://us3.php.net/utf8-decode

那应该有帮助。

于 2009-01-28T15:14:35.577 回答