PHP MySQL utf-8欧元符号在钻石上显示为问号

时间:2015-08-05 07:29:42

标签: php mysql codeigniter utf-8 euro

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

的MySQL

设置为以下编码:

db:  utf8_general_ci
table: utf8_general_ci
column: utf8_general_ci, TEXT

我输入了一些欧元符号和其他一些奇怪的字符

  

acentuação$$

PHP(codeigniter)

配置

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

DSN

char_set=utf8,dbcollat=utf8_general_ci

我提出了一些要比较的问题

模型

$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>'; 
?>

除了最终的回声声明之外,这些现在都没有给我显示正常的欧元符号,它们都为我提供了eurosymbols的问号钻石

1 个答案:

答案 0 :(得分:1)

HEX 是该字符串的utf8编码。所以数据在表格中“正确”。

黑色钻石( )是浏览器说wtf的方式。它来自拥有latin1字符,但告诉浏览器 显示utf8字符。

可以告诉浏览器显示“西方”,即避免潜在的问题。 请记住,目标是真正使用utf8。

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

原因(可能):

  1. 您拥有的字节编码为latin1。您从某处获得了它们 - 文件转储在线输入等。
  2. 连接参数说latin1。
  3. 列/表被声明为CHARACTER SET表示utf8,因此在INSERT期间,它们被正确转换。
  4. 当选择时,步骤2中的设置再次是latin1,因此它们被转换回latin1。
  5. 在网页中显示文本时,页面的标题表示字节为utf8。
  6. 解决方案,计划A:(草率,但可能可行)

    改变#5,所以说出相应的latin1。

    解决方案,B计划:

    1. 将源修复为utf8编码
    2. query("SET NAMES utf8")(除非有办法在连接时设置它)
    3. 将表格/列保留在CHARACTER SET utf8
    4. 第2步涵盖此内容。
    5. 离开<meta ... UTF-*>