2

WAMP サーバーのセットアップ (PHP バージョン 5.3.0、Apache 2.2.11) で奇妙な問題に遭遇しました。sprintf を使用して数値を出力すると、出力文字列に誤った文字が表示されることがあります。

例: (何も削除されていません。これがスクリプト内の唯一のコードです)

$dt1 = new DateTime('now');
$dt2 = new DateTime('now - 10 min');

$interval = $dt1->diff($dt2);

$number = 10.0;
$string = sprintf("%.1f", $number);
echo "number: $number, string: $string\n";

PHP CLI を使用してコマンド プロンプトでこれを実行すると、期待どおりの出力が得られます。

数値: 10、文字列: 10.0

ただし、Apacheを使用して提供すると、ブラウザで

数値: 10、文字列: :.0

「10」があるべき場所にコロンを付けます。(':' は '9' の次の連続する ASCII 文字であることに注意してください。0 から 9 の場合$number、すべてが機能します。10 より大きい数値は、同等の ASCII 文字を使用しているように見えます。つまり、11 は ';'、12 は '<' です。等。)

最も奇妙な点は、上記のコード サンプルの最初の 4 行が結果に影響しているように見えることです。論理的には、これらのステートメントは影響を与えないはずですが、コメントアウトするか削除すると問題は解決します。

何か案は?これを再現できる人は他にいますか?

ノート:

  • 私はphp 5.3.1と5.3.2を試しましたが、どちらも同じように動作します
  • 上記のスクリプトは、ブラウザーでも、Apache の再起動後に 5 ~ 6 回のページ更新で問題なく動作します。次に、説明したように、エラーが返されます
4

2 に答える 2

0

これをコードの上に追加してみてくださいsetlocale(LC_ALL, 'en_US');

于 2010-06-08T21:02:03.983 に答える
0

これを試して:

変更echo "number: $number, string: $string\n";:

for ($i = 0, $n = strlen($string); $i < $n; $i++) {
    echo ord($string[$i]).' ';
}

基本的に、文字列内の各バイトの数値文字コードを提供します。私がバイトと言ったことに注意してください。文字セットの問題、または Apache マングリング バイトの問題である場合は、ここで確認できます。予想される出力は次のとおり49 48 46 48です。代わりに が表示58 46 48される場合は、実際に php のバグを発見した可能性があり、バグ レポートを送信する必要があります。また、php のバージョンをアップグレードしてみてください (5.3.2 は公開されています)...

于 2010-06-09T12:51:19.957 に答える