我正在尝试解决我的网站问题。如果我将包含£
符号的表单提交到同一页面,则会在它到达我的数据库之前返回£
。
我在我的标签中尝试了以下内容:
<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服务器上运行得非常好,但是当我在我的实时环境中运行我的网站时 - 这就是我遇到编码问题的时候。
有没有人有任何其他建议我可以尝试修复它?
答案 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);
}
}