为什么我的输出会改变


Why does my output change?

我正在PHP中使用UTF-8编码,并且我一直设法获得我想要的输出。然后,在代码没有发生任何变化的情况下,输出突然发生了变化。

以前我得到希伯来文输出。现在我得到"&&&&&"

你知道是什么原因导致的吗?

这些是最常见的问题:

  • 你的编辑器,你正在创建PHP/HTML文件
  • 您通过
  • 查看网站的web浏览器
  • 您的PHP web应用程序在web服务器上运行
  • MySQL数据库
  • 任何其他外部你正在读取/写入数据(memcached, api, RSS源等)

有几件事你可以试试:

配置编辑器

确保您的文本编辑器,IDE或您正在编写PHP代码的任何东西以UTF-8格式保存文件。您的FTP客户端,scp, SFTP客户端不需要任何特殊的UTF-8设置。

确保web浏览器知道使用UTF-8

为了确保用户的浏览器都知道读取/写入所有数据为UTF-8,你可以在两个地方设置它。

内容类型标签

确保内容类型的META头指定UTF-8作为字符集,如下所示:

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">

HTTP响应头

确保Content-Type响应头也指定UTF-8作为字符集,如下所示:

ini_set('default_charset', 'utf-8')

配置MySQL连接

现在您知道从用户接收的所有数据都是UTF-8格式,我们需要配置PHP和MySQL数据库之间的客户端连接。有一种通用的方法,只需执行MySQL查询:

SET NAMES utf8;
根据您使用的客户端/驱动程序,有帮助函数可以更轻松地完成此操作:

内置mysql函数

mysql_set_charset('utf8', $link);
与MySQLi

$mysqli->set_charset("utf8")

*与PDO_MySQL (as you connect)*

$pdo = new PDO( 
    'mysql:host=hostname;dbname=defaultDbName', 
    'username', 
    'password', 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") 
);

MySQL数据库

我们现在差不多了,你只需要确保MySQL知道以UTF-8格式存储数据在你的表中。您可以通过查看SHOW TABLE STATUS输出中的Collation值来检查它们的编码(在phpmyadmin中,这显示在表列表中)。如果您的表还不是UTF-8格式(很可能是latin1格式),那么您需要对每个表运行以下命令来转换它们:

ALTER TABLE myTable CHARACTER SET utf8 COLLATE utf8_general_ci;

最后一件要注意的事情

完成所有这些步骤后,现在您的应用程序应该没有任何字符集问题。有一件事需要注意,大多数PHP字符串函数都不支持unicode,因此,例如,如果您对多字节字符运行strlen(),它将返回输入中的字节数,而不是字符数。您可以通过使用多字节字符串PHP扩展来解决这个问题,尽管这些字节/字符问题并不常见。

取自此处:http://webmonkeyuk.wordpress.com/2011/04/23/how-to-avoid-character-encoding-problems-in-php/

尝试用header设置内容类型,如下所示

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

试试这个函数->

$html = "Bla Bla Bla...";
$html = mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8");

查看更多- http://php.net/manual/en/function.mb-convert-encoding.php

我把这个方法放在一起,并在我正在使用的文件中调用它,这似乎解决了问题。

function setutf_8()
    {
    header('content-type: text/html; charset: utf-8');
    mb_internal_encoding('UTF-8');
    mb_http_output('UTF-8');
    mb_http_input('UTF-8');
    mb_language('uni');
    mb_regex_encoding('UTF-8');
    ob_start('mb_output_handler');
    }

谢谢你的帮助!:)