10

最近、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がないと、次の「非常に明確な」メッセージしか表示されません。

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

しかし、ブラウザでは、それでも同じ問題があります。

4

4 に答える 4

1

別のサーバーでこれを試しましたか?

私はあなたの構成だと思います、私は私のサーバー上にテストファイルを作成しました、あなたはここでそれを見ることができます http://cai.tlacaelelrl.com/tests/test.php

内容は

    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ファイルへ

于 2013-05-30T12:07:44.200 に答える
1

PHPの例外メッセージは文字列であり、ニュースはありません。

PHPの文字列はバイナリです。これは事実上、PHPはその中のエンコーディングをまったく気にしないことを意味します。PHPの文字列は、オクテットのバイナリデータで表現できるエンコーディングを保持するだけです(つまり、8ビットが1バイトを形成し、それがPHP文字列の1文字になります)$string[10]11番目の文字にアクセスするようなサブストリングアクセスを使用する場合)。

これらすべてのことにより、メッセージをどのように記述しても、出力に渡されます。

したがって、唯一の違いは、出力の表示方法です。その例外メッセージ文字列にLatin-1エンコーディングが含まれていて、それをApacheサーバー経由で出力し、それをブラウザーで表示すると、ブラウザー(これまでのところ理由は関係ありません)に次のように表示されます。 UTF-8には、疑問符-診断/クリスタルが表示されます。

端末がUTF-8として表示する場合、同じことが端末にも当てはまります。

または、出力をファイルに保存してから、そのファイルをUTF-8でエンコードされたものとしてエディターで開く場合。

では、それを修正する方法は?お使いのブラウザについては、ブラウザのドキュメントを調べて、現在表示しているWebサイトをどのエンコーディングで表示するかをブラウザに指示する方法を確認してください。私が知っているすべてのブラウザには、それを指定できるある種のメニューがあります。使用する文字セットはcommonであるため、古いブラウザでも使用できます。

同じことが端末にも当てはまります。シェルのロケールと端末のエンコーディングを設定できます。使用しているシェルのドキュメントを参照してください。

テキストファイルについては、あなたはすでにそれを処理する方法を知っているに違いありません:あなたのエディタが提供するオプションをチェックしてください。


注意の最後の注意:例外メッセージ出力を含むリクエストに対してサーバーが返すものを適切に分析する場合は、ブラウザーの開発者ツールを使用して、サーバーの応答ヘッダーを表示する必要があります。以前の構成への変更が(誤って)コンテンツがUTF-8でエンコードされているのに対し、エンコードはlatin-1であるという変更が表示される可能性があります。ブラウザのエンコーディングを手動で変更したくない場合は、このエラーを修正してください。これを行うには、PHPのドキュメントとWebサーバーのドキュメントを参照してください。

于 2013-07-18T11:00:48.007 に答える
1

ab@php.netは説明を思いついた:

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

修正できない理由は単純です。5.4以降、PHPの内部エンコーディングはUTF-8であり、以前はlatin1でした。他のすべてはほとんど変化がありません。

HTMLコンテキストで表示するすべてのエラーメッセージでは、エンティティを変換する必要があります。そのために、htmlspecialchars()と同じ機能が使用されます。PHP 5.4より前はlatin1を使用するように強制されていましたが、現在はUTF8を使用するように強制されています。デザインごとにあります。content-typeまたはdefault_charsetでheader()を使用すると、content-typeヘッダーの検知にのみ影響します。

したがって、latin1でエラーテキストを使用しますが、エンティティの変換にはUTF-8が使用され、最初の無効な文字で終了します。コード内の関連する場所:http: //lxr.php.net/xref/PHP_5_4/main/main.c#1083、その後、determine_charset()は変換文字セットのUTF8を配信します。それがあなたのアクセント文字が飲み込まれる理由です。そして、それがHuiがこれを再現できなかった理由です-以前の彼の投稿を見ると、確かにlatin1はコンテンツタイプで送信されますが、明らかにUTF-8でエンコードされたPHPスクリプトが使用されているため、エラーメッセージは「致命的なエラー:キャッチされていません例外「例外」とメッセージ「é」の...」。ただし、現在の条件では、UTF-8でスクリプトを使用する必要はありません。ラテン語でエンコードされたスクリプトでは、utf8_encode('é')を使用して例外をスローできます。CLIで機能する理由は、HTMLエンティティをエンコードする必要がないため、charがそのまま出力に渡されるためです。

これはすべて、実際にはこの問題が常に存在することを意味しますが、デフォルトのiso-8859-1を使用するユーザーに有利でした。現在、デフォルトのUTF-8を使用しているユーザーは利益を上げています。これを解決するためにコードを調べると、このチケットだけで必要とされるよりも多くのグローバルな侵入が必要になる可能性があります。

htmlspecialchars()の動作の変更については、バグ#61354も参照してください。

于 2013-08-04T14:46:30.990 に答える
0

同じ問題が発生し、適切な解決策が見つかりませんでした(.htaccessの「AddCharsetISO-8859-1.php」が機能しません)。あなたはこれを使うことができます:

新しいException(htmlentities('é'、ENT_COMPAT、'ISO-8859-1'));をスローします。

しかし、Xdebugは次のように表示します。

à

何もないよりはまし

于 2013-06-24T13:35:33.603 に答える