【问题标题】:PHP MySQL utf-8 Euro symbol shown as questionmark on a diamondPHP MySQL utf-8 欧元符号在菱形上显示为问号
【发布时间】:2015-10-27 20:21:08
【问题描述】:

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

MySQL

设置为以下编码:

db:  utf8_general_ci
table: utf8_general_ci
column: utf8_general_ci, TEXT

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

acentuação €€€€€

PHP(代码点火器)

配置

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

除了最后的回声语句之外,这些现在都没有向我显示正常的欧元符号,它们都给了我欧元符号的问号菱形

【问题讨论】:

  • 使用 base64_encode() 将它们存储在 DB 中,并与 base64_decode 一起使用
  • 在 MySQL 编辑器或 phpmyadmin 中运行查询时会得到什么? SELECT shortdesc,HEX(shortdesc) FROM contracttypes WHERE id = 4
  • 我得到了 shortdesc HEX(shortdesc) acentuação €€€€€ 6163656E747561C3A7C3A36F20E282ACE282ACE282ACE282ACE282AC 这样就可以了
  • 您使用的是哪个 CI 版本和数据库驱动程序?
  • CodeIgniter 3.0.0 和 PDO mysql

标签: php mysql codeigniter utf-8 euro


【解决方案1】:

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

黑色菱形 (�) 是浏览器表示 wtf 的方式。它来自具有 latin1 字符,但告诉浏览器 显示 utf8 字符。

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

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

原因(可能):

  1. 您拥有的字节是 latin1 编码的。你从某个地方获得它们——文件转储在线输入等。
  2. 连接参数表示latin1。
  3. 列/表声明为 CHARACTER SET 表示 utf8,因此在 INSERT 期间,它们被正确转换。
  4. SELECTing 时,步骤 2 中的设置又是 latin1,因此它们被转换回 latin1。
  5. 在网页中显示文本时,页面标题显示字节为 utf8。

解决方案,A 计划:(草率,但可能可行)

更改 #5,所以说适当的 latin1 等价物。

解决方案,B 计划:

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

【讨论】:

    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    相关资源
    最近更新 更多