为什么输出会改变?

时间:2013-05-27 05:35:35

标签: php utf-8

我正在使用PHP中的UTF-8编码,我一直在努力获取输出,就像我想要的那样。然后,没有任何代码发生,输出突然发生变化。

以前我得到了希伯来语输出。现在我得到了“&&&&&&”。

任何可能导致此问题的想法?

4 个答案:

答案 0 :(得分:3)

这些是最常见的问题:

  • 您正在使用
  • 创建PHP / HTML文件的编辑器
  • 您正在通过
  • 查看网站的网络浏览器
  • 您在Web服务器上运行的PHP Web应用程序
  • MySQL数据库
  • 您正在从(memcached,API,RSS feed等)读取/写入数据的其他任何地方

你可以尝试一些事情:

配置您的编辑器

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

确保网络浏览器知道使用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(连接时)*

$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输出中的Collat​​ion值来检查其编码(在phpmyadmin中,这将显示在表的列表中)。 如果你的表还没有UTF-8(它们可能在latin1中),那么你需要通过对每个表运行以下命令来转换它们:

ALTER TABLE myTable CHARACTER SET utf8 COLLATE utf8_general_ci;

最后要注意的是

现在所有这些步骤都已完成,您的应用程序应该没有任何字符集问题。 有一点需要注意,大多数PHP字符串函数都不能识别unicode,例如,如果对多字节字符运行strlen(),它将返回输入中的字节数,而不是数字字符。您可以使用Multibyte String PHP扩展来解决这个问题,尽管这些字节/字符问题不常见会导致问题。

此处采取的形式为:http://webmonkeyuk.wordpress.com/2011/04/23/how-to-avoid-character-encoding-problems-in-php/

答案 1 :(得分:1)

尝试使用header这样的

设置内容类型后再尝试
header('Content-Type: text/html; charset=utf-8');

答案 2 :(得分:1)

尝试此功能 - &gt;

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

了解更多信息 - http://php.net/manual/en/function.mb-convert-encoding.php

答案 3 :(得分:-1)

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

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');
    }

感谢您的帮助! :)