PHP 5.4抛出异常 - 无法看到带有ISO-8859-1编码的字符串消息的消息

Hen*_*los 10 php apache exception character-encoding

我最近从apt-get在我的Ubuntu 12.10上安装了PHP 5.4.

PHP Info显示: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('é');
Run Code Online (Sandbox Code Playgroud)

如果上面的代码是在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
Run Code Online (Sandbox Code Playgroud)

如果文件是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
Run Code Online (Sandbox Code Playgroud)

但是,如果没有Xdebug,我得到的只是"非常明确"的信息:

Fatal error: in /home/henrique/public/teste.php on line 5
Run Code Online (Sandbox Code Playgroud)

也许这是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
Run Code Online (Sandbox Code Playgroud)

消息仍在那里,然而,它是难以辨认的,但有...

编辑

我也试过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
Run Code Online (Sandbox Code Playgroud)

但在浏览器中,仍然存在同样的问题.

Hen*_*los 1

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

\n\n

https://bugs.php.net/bug.php?id=63426&edit=2

\n\n
\n

无法修复的原因很复杂也很简单。从 5.4 开始,\n PHP 的内部编码是 UTF-8,之前是 latin1。\n 其他一切几乎没有变化。

\n\n

要在 HTML 上下文中显示的每条错误消息都需要转换实体。为此,使用与 htmlspecialchars()\n 中相同的功能。PHP 5.4 之前强制使用 latin1,现在强制使用 UTF8。每个设计都有。将 header() 与 content-type 或 default_charset 一起使用仅影响内容类型标头的发送。

\n\n

因此,您在 latin1 中使用错误文本,但 UTF-8 将用于转换\n 实体,并且该实体将在第一个无效字符处终止。代码中的相关位置: http://lxr.php.net/xref/PHP_5_4/main/main.c#1083,随后确定_charset()将提供UTF8进行转换字符集。这就是你的重音字符被吞掉的原因。这就是 Hui 无法重现此内容的原因 - 如果您之前查看他的帖子,确实 latin1 是以内容类型发送的,但显然使用了 UTF-8 编码的 PHP 脚本,所以错误消息是“致命\n错误:未捕获异常\'Exception\',消息\'\xc3\x83\xc2\xa9\' in ...”。然而,当前情况并不强制您使用 UTF-8 格式的脚本,在以拉丁语编码的脚本中,您仍然可以使用 utf8_encode(\'\xc3\xa9\') 抛出\n 异常。它与 CLI 一起使用的原因是\n 因为不需要对 HTML 实体进行编码,因此字符按原样传递\n 到输出。

\n\n

这实际上意味着这个问题一直存在,但它有利于使用默认 iso-8859-1 的用户。现在,使用默认 UTF-8\n 的用户可以获利。通过查看代码来解决此问题可能需要比仅此票证所需的更多的全局入侵。

\n\n

对于 htmlspecialchars() 行为更改另请参阅 bug #61354

\n
\n