发布值编码问题。 £变成£

时间:2013-11-27 13:23:44

标签: php post encoding utf-8

我正在尝试解决我的网站问题。如果我将包含£符号的表单提交到同一页面,则会在它到达我的数据库之前返回£

我在我的标签中尝试了以下内容:

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

<meta charset="utf-8">

我在每一页的开头尝试了所有这些:

header('Content-Type: text/html; charset=utf-8');
mb_internal_encoding('utf-8');
ini_set('default_charset', 'utf-8');

我的数据库连接字符串中也有SET NAMES

new PDO("mysql:host=localhost;dbname=########", "##########", "######", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

起初我认为这是我的数据库,因为值存储在那里有这些值 - 但是我已经意识到如果我提交表单并且它有验证错误,我通过{{1}获取提交的值并且它返回文本框中带有奇怪字符的值。

它在我的本地WAMP服务器上运行得非常好,但是当我在我的实时环境中运行我的网站时 - 这就是我遇到编码问题的时候。

有没有人有任何其他建议我可以尝试修复它?

1 个答案:

答案 0 :(得分:1)

您的问题是您的实时服务器使用的PHP版本低于5.4.0,因此当您使用htmlentities时,它默认为ISO-8859-1,因为manual指定:

  

与htmlspecialchars()类似,htmlentities()采用可选的第三个参数编码来定义转换中使用的编码。如果省略,则该参数的默认值为5.4.0之前的PHP版本中的ISO-8859-1,以及PHP 5.4.0之后的UTF-8。

您可以使用UTF-8作为第三个参数来解决此问题,或者只是创建默认为它的自己的函数:

if (!function_exists('htmlentities_utf8')) {
    function htmlentities_utf8($string, $flags = null, $encoding = 'UTF-8', $double_encode = true) {
        if ($flags === null) {
            $flags = ENT_COMPAT | ENT_HTML401;
        }

        return htmlentities($string, $flags, $encoding, $double_encode);
    }
}

或者,如果您打算使用其他编码,则可以使其获取default_charset值:

if (!function_exists('htmlentities_dc')) {
    function htmlentities_dc($string, $flags = null, $encoding = null, $double_encode = true) {
        if ($flags === null) {
            $flags = ENT_COMPAT | ENT_HTML401;
        }

        if ($encoding === null) {
            $encoding = ini_get('default_charset');
        }

        return htmlentities($string, $flags, $encoding, $double_encode);
    }
}