【问题标题】:Get question marks for special characters after trying several things. What else can I try?在尝试了几件事后获取特殊字符的问号。我还能尝试什么?
【发布时间】:2016-09-20 02:26:18
【问题描述】:

我正在努力解决我网站上的特殊字符编码问题。我有一个带有连接的datalistinput 字段。 datalist 在页面加载时从我的数据库中填充。但不知何故,我在数据列表选项中的每个特殊字符和特殊语言字符(例如中文)的普通问号中得到了菱形符号内的问号。这是我尝试过的:

  1. 初始数据集是一个 csv 文件,我将其包含在我的数据库中。我在 Notepad++ 中检查了排序规则,它设置为 UTF8 without BOM
  2. 我正在使用 phpmyadmin 进行数据库管理。服务器连接排序规则设置为 utf8mb4_bin。我存储数据的表具有排序规则 utf8_bin。当我导入数据时,我确保使用 utf8。字符在 phpmyadmin 中也能正确显示。
  3. 在我的 index.php 文件的 <head> 部分中,我还有以下 <meta http-equiv="Content-Type" content="text/html;charset=utf-8">

但我仍然得到那些问号。我还能检查什么?

【问题讨论】:

  • 使用 htmlentities()
  • 试试:<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  • @Thamilan 现在可以正确显示欧洲特殊字符。我以为它们会被包含在 utf-8 中!?但是,特殊语言字符(例如中文)仍以正常的问号符号显示(周围没有菱形)

标签: php mysql utf-8 phpmyadmin collation


【解决方案1】:

您可以使用此 sn-p 轻松检查从 DB 检索的字符串是否为有效的 utf8。 如果它是有效的 UTF-8,那么您的问题出在表示层。

if(mb_detect_encoding($str, 'UTF-8', true)){ die('I\'m a valid UTF-8 string, YAY :D '); }

【讨论】:

  • 很难正确检测字符编码,因为大量重叠以及各种编码范围内存在的差距。虽然您的回答是一个很好的建议,但它并不是一个完全可靠的结果生成器。
  • 我完全同意,但由于问题很模糊,这感觉是一个不错的起点。
【解决方案2】:

我正在使用 phpmyadmin 进行数据库管理。服务器连接排序规则设置为 utf8mb4_bin。 我存储数据的表具有排序规则 utf8_bin。当我导入数据时,我确保使用 utf8。字符在 phpmyadmin 中也能正确显示。

这是一个可能的原因,您想将其更改为 utf8mb4_Collat​​ion

其他点是使用PHPmb_等动作

mb_internal_encoding('UTF-8');
mb_http_output('UTF-8'); 

在您的 PHP 页面的顶部。还要确保在您的数据库连接对象中设置 connection 字符集:

$this->MySQLiObjectVariable->set_charset("utf8mb4"); 

set_charset Manual Page

经常发生的情况是,虽然 MySQL storage 设置正确并且 PHP 输出设置正确,但两者之间的通信设置为系统默认值,这通常不是最佳字符集给定数据(通常是latin1_utf8_)。

另外,忽略 Meta 字符集声明并使用直接的 HTML 标头实际设置它们通常是有益的,例如:

<?php
header('Content-Type: text/html; charset=utf-8');

出现在 HTML 内容之前的输出页面上,确保浏览器以 UTF-8 格式接收数据。

另请阅读UTF-8 all the way through

【讨论】:

  • 感谢您的长回答。我尝试将所有内容更改为 utf8mb4 并尝试包含 PHP mb_ 操作,但仍然没有成功。我存储在一个额外的 header.php 文件中的站点的标题信息,我包含在每个站点中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 2018-04-15
相关资源
最近更新 更多