我刚刚安装了所有常见的软件包,如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,我得到的是这个“非常澄清”的消息:
Fatal error: in /home/henrique/public/teste.PHP on line 5
也许这是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
但是在浏览器中,还是一样的问题.
PHP中的字符串是二进制的.这实际上意味着PHP并不关心其中的编码,PHP中的字符串只保留可以以八位字节表示的二进制数据的任何编码(也就是说,8位形成一个单字节,然后是PHP字符串中的一个字符如果使用像$string [10]这样的子字符串访问来访问第11个字符).
因为所有这些都确保你写的消息,但是它将被传递到输出.
所以唯一的区别是如何显示输出.假设您在该异常消息字符串中具有Latin-1编码,并通过您的apache服务器输出,然后在浏览器和浏览器中查看(我们不关心到目前为止的原因)将其显示为UTF-8你会看到这个问号 – diagmond / crystal: .
如果终端将其显示为UTF-8,则同样适用于终端.
或者将输出保存到文件中,然后在编辑器中将该文件打开为UTF-8编码.
那么怎么解决呢?对于您的浏览器,请查看浏览器的文档,了解您的浏览器应该显示当前正在查看的网站的编码.我知道的每个浏览器都有某种菜单,您可以在其中指定.您使用的字符集是commmon,所以即使是较老的浏览器也是这样.
终端同样适用.您可以设置shell的区域设置以及终端的编码.请参阅您正在使用的shell的文档.
对于文本文件,我敢打赌,你现在已经知道如何处理它:检查您的编辑器提供哪些选项.
最后一个注意事项:如果要正确地分析您的服务器返回到包含异常消息输出的请求,则需要使用浏览器的开发人员工具来使服务器的响应标头可见.您可能会看到对以前配置的更改(错误)表示在编码为拉丁文-1时内容为UTF-8编码.如果您不想手动更改浏览器中的编码,请修复该错误.为此,请参阅PHP文档和Web服务器的文档.