PHP MySQL utf-8欧元符号在菱形上显示为问号

PHP MySQL utf-8欧元符号在菱形上显示为问号,php,mysql,codeigniter,utf-8,euro,Php,Mysql,Codeigniter,Utf 8,Euro,经过一整天的谷歌搜索和调试,我终于来到了这里 MySQL 设置为以下编码: db: utf8_general_ci table: utf8_general_ci column: utf8_general_ci, TEXT 我放了一些欧元符号和其他一些奇怪的字符 阿森图阿 PHP代码点火器 配置 $config['charset'] = 'UTF-8'; dsn 我提出了一些问题进行比较 模型 控制器 这个输出 array (size=2) 'latin1' => object(st

经过一整天的谷歌搜索和调试,我终于来到了这里

MySQL 设置为以下编码:

db:  utf8_general_ci
table: utf8_general_ci
column: utf8_general_ci, TEXT
我放了一些欧元符号和其他一些奇怪的字符

阿森图阿

PHP代码点火器 配置

$config['charset'] = 'UTF-8';
dsn

我提出了一些问题进行比较

模型 控制器 这个输出

array (size=2)
'latin1' => 
object(stdClass)[34]
public 'shortdesc' => string 'acentua��o �����' (length=16)
public 'HEX(shortdesc)' => string '6163656E747561C3A7C3A36F20E282ACE282ACE282ACE282ACE282AC' (length=56)
'utf8' => 
object(stdClass)[33]
public 'shortdesc' => string 'acentuação €€€€€' (length=28)
public 'HEX(shortdesc)' => string '6163656E747561C3A7C3A36F20E282ACE282ACE282ACE282ACE282AC' (length=56)
到目前为止一切都很好

看法 现在,除了最后的echo语句外,所有这些符号都没有显示正常的欧元符号,它们都为欧元符号提供问号菱形

十六进制是该字符串的utf8编码。因此,数据在表中“正确”显示

黑钻石� 是浏览器表示wtf的方式。它来自于拉丁文字符,但是告诉浏览器 显示utf8字符

您可以告诉浏览器显示Western,这可以避免潜在的问题。 记住,目标是真正使用utf8

有时,这与问号一起出现,在这种情况下,您必须重新开始

原因可能是:

您的字节编码为拉丁文1。你从某处获得它们-文件转储在线输入,等等。 连接参数为1。 列/表被声明为字符集utf8,因此在INSERT期间,它们被正确转换。 选择时,步骤2中的设置再次为latin1,因此它们被转换回latin1。 当在网页中显示文本时,页面的标题表示字节为utf8。 解决方案,方案A:草率,但可能可行

将5改为拉丁语1的相应对等词

解决方案B:

将源代码固定为utf8编码 除非有办法在连接时设置,否则querySET将命名为utf8 将表格/列保留在字符集utf8处 第二步包括这一点。 离开
使用base64_encode将它们存储在DB中,并将它们与base64_decode一起使用在MySQL编辑器或phpmyadmin中运行查询时会得到什么?从contracttypes中选择shortdesc,HEXshortdesc,其中id=4I获取shortdesc HEXshortdesc acentuaço€€6163656e747561c3a7c3a36f20e282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace2
$query = $this->db->query("SET NAMES latin1");
$query = $this->db->query("SELECT shortdesc,HEX(shortdesc) FROM `contracttypes` WHERE id = 4");
$ret['latin1'] =  $query->row();
$query = $this->db->query("SET NAMES utf8");
$query = $this->db->query("SELECT shortdesc,HEX(shortdesc) FROM `contracttypes` WHERE id = 4");
$ret['utf8'] =  $query->row();
return $ret;;
public function utfhell()  {
var_dump($this->campagne_model->utfhell());
}
array (size=2)
'latin1' => 
object(stdClass)[34]
public 'shortdesc' => string 'acentua��o �����' (length=16)
public 'HEX(shortdesc)' => string '6163656E747561C3A7C3A36F20E282ACE282ACE282ACE282ACE282AC' (length=56)
'utf8' => 
object(stdClass)[33]
public 'shortdesc' => string 'acentuação €€€€€' (length=28)
public 'HEX(shortdesc)' => string '6163656E747561C3A7C3A36F20E282ACE282ACE282ACE282ACE282AC' (length=56)
<?php header('Content-Type: text/html; charset="utf-8"', true); ?>
<!doctype html>
<html>
<head>
<title>UTFhell</title>
<link rel="stylesheet" href="../assets/css/style.css"/>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
...
<?php
echo 'Original : ', $campagne_info->contractName->shortdesc."<br />";
echo 'UTF8 Encode : ', utf8_encode($campagne_info->contractName->shortdesc)."<br />";
echo 'UTF8 Decode : ', utf8_decode($campagne_info->contractName->shortdesc)."<br />";
echo 'TRANSLIT : ', iconv("ISO-8859-1", "UTF-8//TRANSLIT", $campagne_info->contractName->shortdesc)."<br />";
echo 'IGNORE TRANSLIT : ', iconv("ISO-8859-1", "UTF-8//IGNORE//TRANSLIT", $campagne_info->contractName->shortdesc)."<br />";
echo 'IGNORE   : ', iconv("ISO-8859-1", "UTF-8//IGNORE", $campagne_info->contractName->shortdesc)."<br />";
echo 'Plain: ', iconv("ISO-8859-1", "UTF-8", $campagne_info->contractName->shortdesc)."<br />";
echo '€€€€€€€€€€<br>'; 
?>