【问题标题】:Question Marks Instead of Chinese Characters问号代替汉字
【发布时间】:2011-03-07 15:04:36
【问题描述】:

我正在尝试在网站上放置一些中文文本,但页面一上线,我看到的不是中文文本,而是一排问号?????????? ?????????????

我在 WAMP 服务器上测试了相同的页面,然后才将其上线(所有页面都有 php 扩展名)并且汉字显示很好,只有当页面从在线主机服务器请求时,我才能看到全部问号。

页面包含(如果有帮助的话):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

【问题讨论】:

  • 检查服务器发送的标头。 Content-type 标头可能会覆盖您的元标记。
  • 在粘贴到您的网页之前,请检查您的中文文本是否以 utf-8 编码。有效的页面标题是什么?
  • 我对标头不太熟悉,这是来自工作页面的响应标头: 日期:Thu, 2010 年 6 月 24 日 05:24:23 GMT 服务器:Apache/2.0.63 (Win32) PHP/5.2.11 X-Powered-By: PHP/5.2.11 Content-Length: 3622 Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Content-Type: text/html; charset=UTF-8 200 OK 和非工作页面:日期:2010 年 6 月 24 日星期四 05:26:54 GMT 服务器:Apache X-Powered-By:PHP/5.2.12 连接:关闭传输编码:分块内容-类型:文本/html 200 OK
  • 我想补充一点,当文档具有 php 扩展名时,我只会看到问号,但是,如果我将其更改为 html,则文本显示正常。
  • 如果您使用 .php 扩展名保存,您的编辑器可能没有将其保存为 UTF-8。

标签: php character-encoding cjk


【解决方案1】:

由于 PHP 中的 mysql_* 函数自 PHP 5.5.0 起已弃用,因此您可以执行的 SQL 与 mysql_set_charset 基本相同:

SQL SET character_set_client = utf8

这是让我的表单将 unicode 文本保存到 MySQL 的关键。在与 MySQL 服务器建立连接后立即执行该 SQL 查询。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,并且能够解决它。

    我有通过 PHP 传递的网站内容。当我将其视为原始 HTML 文件时,它会正确显示字符,但如果我通过 PHP 传递它(在我的情况下,使用 auto_prepend_file),它会将字符变成问号。

    解决方案是在 PHP 设置中关闭 detect_unicode。就我而言,我只是编辑了 .htaccess 文件以包含以下行:

    php_value detect_unicode "0"
    

    ...中文字符开始正常显示。可能有使用 ini_set() 的等效解决方案。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      实际的 HTTP 响应标头将始终覆盖 HTML &lt;meta&gt; 标头。根据您的评论:

      我对标头不太熟悉,这是来自工作页面的响应标头:

      日期:2010 年 6 月 24 日星期四 05:24:23 GMT
      服务器:Apache/2.0.63 (Win32) PHP/5.2.11
      X-Powered-By: PHP/5.2.11
      内容长度:3622
      保活:超时=15,最大值=100
      连接:保持活动
      内容类型:文本/html;字符集=UTF-8
      200 确定
      和非工作页面:
      日期:2010 年 6 月 24 日星期四 05:26:54 GMT
      服务器:阿帕奇
      X-Powered-By: PHP/5.2.12
      连接:关闭
      传输编码:分块
      内容类型:文本/html
      200 好
      

      看,非工作页面的 HTTP 响应标头有一个 Content-Typetext/html 没有任何指定的字符集。应该是text/html; charset=UTF-8

      您可以通过将以下行添加到 PHP 页面的 顶部向响应正文发出任何字符 (HTML) 来解决此问题。 p>

      header('Content-Type: text/html; charset=UTF-8');
      

      更新: 根据 cmets,上述原因似乎已被排除。下一步检查;文件本身是否保存为 UTF-8?右键单击页面并查看源代码。问号也有吗?如果是这样,那么在 FTP 传输到主机期间出现了问题。选择二进制而不是文本/ASCII 或在 FTP 客户端设置中为传输的文本文件设置字符编码,然后重试。

      【讨论】:

      • 好的,我放了 在文档的第一行,响应头返回 Content-Type: text/html; charset=UTF-8,但是我仍然只看到问号
      • 好的,我将传输类型更改为二进制,仍然没有运气我检查了页面源,是的,问号仍然存在。当我在 cpanel 中检查文件的来源时,我可以看到中文文本(所以 ftp 传输看起来很好)
      • 看起来像网络服务器问题。我会咨询托管支持。
      【解决方案4】:

      如果您使用某种数据库,请确保在查询数据库之前运行此程序(但在建立连接之后):

      mysql_set_charset("utf8");
      

      【讨论】:

      • 谢谢,这对我有用。考虑到我的数据库中的所有内容都是 utf-8 并且我的 php 文件也保存为 utf-8,你能解释一下为什么这是必要的吗?
      • @Shawn 我不太确定,但我的猜测是连接取决于远程服务器上安装的语言环境,这不是开发人员在开发时设置/通常知道的时间。
      • 对于 PDO:$dbh->exec("set names utf8");它困扰了我 1 小时和 10 分钟:P
      • 在 PDO 中,在连接字符串中使用charset=utf8
      猜你喜欢
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 2011-02-11
      相关资源
      最近更新 更多