经过一整天的谷歌搜索和调试,我最终来到这里。
MySQL
设置为以下编码:
db: utf8_general_ci
table: utf8_general_ci
column: utf8_general_ci, TEXT
我放了一些欧元符号和一些其他奇怪的字符
acentuação €€€€€
PHP(代码点火器)
配置
$config['charset'] = 'UTF-8';
数据中心
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;;
Controller
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>';
?>
除了最后的 echo 语句,现在没有一个给我显示正常的欧元符号,它们都给我欧元符号的问号菱形
最佳答案
HEX 是该字符串的 utf8 编码。所以数据“正确”在表中。
黑色菱形 (�) 是浏览器表达 wtf 的方式。它来自具有 latin1 字符,但告诉浏览器 显示utf8字符。
您可以告诉浏览器显示“Western”,这样可以避免潜在的问题。 请记住,目标是真正使用 utf8。
有时这会与问号一起出现,在这种情况下您必须重新开始。
原因(可能):
- 你的字节编码为 latin1。您从某个地方获得了它们——文件转储在线输入等。
- 连接参数表示latin1。
- 列/表被声明为 CHARACTER SET 表示 utf8,因此在 INSERT 期间,它们被正确转换。
- 选择时,第 2 步中的设置再次为 latin1,因此它们被转换回 latin1。
- 在网页中显示文本时,页面的标题表示字节是 utf8。
解决方案,A 计划:(草率,但可能可行)
更改 #5,说出 latin1 的适当等价物。
解决方案,B 计划:
- 将源代码修复为 utf8 编码
-
query("SET NAMES utf8")
(除非有办法在连接时设置它) - 将表/列保留在
CHARACTER SET utf8
- 第 2 步涵盖了这一点。
- 离开
<meta ... UTF-*>
.
关于PHP MySQL utf-8 欧元符号在菱形上显示为问号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31826051/