PHP5.4抛出异常-Can';t查看带有ISO-8859-1编码字符串消息的消息

PHP5.4抛出异常-Can';t查看带有ISO-8859-1编码字符串消息的消息,php,apache,exception,character-encoding,Php,Apache,Exception,Character Encoding,我最近从apt get在我的Ubuntu12.10上安装了PHP5.4 PHP信息显示:PHP版本5.4.6-1ubuntu1 我只是安装了所有常用软件包,比如mysql、pgsql、curl等,没有做任何其他更改,但我遇到了一个问题 我喜欢在我的文件和数据库中使用ISO-8859-1/latin1编码,因为这是我获得最佳工作流程的地方。现在我遇到了一个问题,因为PHP似乎无法处理消息以这种方式编码的异常 为了更好地澄清,我创建了一个如下的测试文件: ini_set('display_error

我最近从apt get在我的Ubuntu12.10上安装了PHP5.4

PHP信息显示:PHP版本5.4.6-1ubuntu1

我只是安装了所有常用软件包,比如mysql、pgsql、curl等,没有做任何其他更改,但我遇到了一个问题

我喜欢在我的文件和数据库中使用ISO-8859-1/latin1编码,因为这是我获得最佳工作流程的地方。现在我遇到了一个问题,因为PHP似乎无法处理消息以这种方式编码的异常

为了更好地澄清,我创建了一个如下的测试文件:

ini_set('display_errors', 1);
error_reporting(E_ALL);

throw new Exception('é');
如果上面的代码在utf-8文件中,那么在启用Xdegub的情况下,一切正常:

( ! ) Fatal error: Uncaught exception 'Exception' with message 'é' in /home/henrique/public/teste.php on line 5
( ! ) Exception: é in /home/henrique/public/teste.php on line 5
Call Stack
#   Time    Memory  Function    Location
1   0.0002  124212  {main}( )   ../teste.php:0
如果文件在ISO-8859-1中,如果启用了Xdebug,则问题只是没有显示消息:

( ! ) Fatal error: in /home/henrique/public/teste.php on line 5
( ! ) Exception: in /home/henrique/public/teste.php on line 5
Call Stack
#   Time    Memory  Function    Location
1   0.0002  124436  {main}( )   ../teste.php:0
但是,如果没有Xdebug,我得到的只是“非常清晰”的信息:

也许这是Apache内部的一个问题,因为当我使用命令行尝试相同的操作时,我得到:

Stack trace:
#0 {main}
  thrown in /home/henrique/public/teste.php on line 5

Fatal error: Uncaught exception 'Exception' with message '�' in /home/henrique/public/teste.php on line 5

Exception: � in /home/henrique/public/teste.php on line 5

Call Stack:
    0.0002     121256   1. {main}() /home/henrique/public/teste.php:0
信息仍然在那里,然而,它是难以辨认的,但是在那里

编辑 我还尝试了Lighttpd 1.4.28,结果是一样的

编辑2: 使用PHP 5.4内置服务器进行了尝试,并在我的终端上实现了以下功能:

[Wed Jun  5 21:32:08 2013] PHP Fatal error:  Uncaught exception 'Exception' with message '�' in /var/www/test2.php:9
Stack trace:
#0 {main}
  thrown in /var/www/test2.php on line 9
[Wed Jun  5 21:32:08 2013] 127.0.0.1:55116 [200]: /test2.php - Uncaught exception 'Exception' with message '�' in /var/www/test2.php:9
Stack trace:
#0 {main}
  thrown in /var/www/test2.php on line 9

但在浏览器中,仍然存在相同的问题。

您是否在其他服务器上尝试过此操作

我想这是你的配置,我在我的服务器上创建了一个测试文件,你可以在这里查看

内容是

    ini_set('display_errors', 1);
    error_reporting(E_ALL);
    print 'Character encoding is: '.mb_internal_encoding();
    throw new Exception('é');
字符集应用于文件,我还将字符集添加到htaccess文件中

我不确定这是否是因为xdebug,但我无法在启用它的情况下进行测试

你能试着加上这个吗

   AddCharset ISO-8859-1 .php

对于您的.htaccess文件

我也有同样的问题,并且没有找到好的解决方案(.htaccess中的AddCharset ISO-8859-1.php不起作用)。 您可以使用以下方法:

抛出新异常(htmlentities('e',ENT_COMPAT,'ISO-8859-1')

但Xdebug将显示:

&阿格拉夫


总比什么都没有好

PHP中的异常消息是一个字符串,就像没有新闻一样

PHP中的字符串是二进制的。这实际上意味着PHP根本不关心其中的编码,PHP中的字符串只保留任何可以用八位字节的二进制数据表示的编码(即8位组成一个字节,如果您使用子字符串访问,如
$string[10]
访问第11个字符,那么它就是PHP字符串中的一个字符)

所有这些都确保了无论您如何编写消息,它都将被传递到输出中

因此,唯一的区别是如何显示输出。假设您在该异常消息字符串中使用了拉丁-1编码,并通过apache服务器输出,然后在浏览器中查看,浏览器(目前不关心原因)将其显示为UTF-8,您将看到问号diagmond/crystal:�.

如果终端显示为UTF-8,则同样适用于终端

或者,如果将输出保存到文件中,然后在编辑器中以UTF-8编码的形式打开该文件

那么如何解决这个问题呢?对于您的浏览器,请查看您的浏览器文档,了解您如何告诉您的浏览器您当前正在查看的网站应以哪种编码显示。我知道的每个浏览器都有某种菜单,您可以在其中指定它。您使用的字符集是commmon,所以即使是较旧的浏览器也有

这同样适用于终端。您可以设置shell的区域设置以及终端的编码。请参阅您正在使用的shell的文档

对于文本文件,我打赌您现在已经知道如何处理它:检查编辑器提供的选项



最后要注意的是:如果您想正确分析服务器返回到包含异常消息输出的请求的内容,则需要使用浏览器的开发人员工具使服务器的响应头可见。您可能会看到对以前配置的更改(错误)表明内容是UTF-8编码的,而编码是拉丁语-1。如果不想手动更改浏览器中的编码,请修复该错误。为此,请参阅PHP文档和Web服务器的文档。

ab@php.net提出了一个解释:

它无法修复的原因很复杂,很简单。自5.4 PHP的内部编码是UTF-8,以前是拉丁文1。 其他一切几乎没有变化

要在HTML上下文中显示的每个错误消息都需要有实体 转换。为此,请使用与htmlspecialchars()中相同的功能 使用。在PHP5.4之前,它被迫使用拉丁语1,现在它是 被迫使用UTF8。每种设计都有一个。将header()用于 内容类型或默认字符集仅影响 内容类型标题

因此,您使用拉丁文1中的错误文本,但UTF-8将用于转换 实体,并且将在第一个无效字符处消失。相关 在代码中放置:, 随后确定_charset()将为转换提供UTF8 查塞特。这就是你的口音字符被吞没的原因。及 这就是为什么Hui不能复制这个-如果你看 他之前的文章,确实是拉丁文1,是以内容类型发送的,但很明显 使用了UTF-8编码的PHP脚本,因此错误消息为“致命” 错误:未捕获的异常“exception”,消息“é在…”中。这个 但是,当前条件不强制您在中使用脚本 UTF-8,在用拉丁语编码的脚本中,您仍然可以抛出 使用utf8_编码('é')时出现异常。它使用CLI的原因是 因为不需要对HTML实体进行编码,所以会传递字符 输出也是如此

这一切实际上意味着这个问题一直存在,但它是存在的 支持默认iso-8859-1的用户。现在,用户可以使用默认设置
   AddCharset ISO-8859-1 .php