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 字符,如果$number是 0-9,一切正常。大于 10 的数字似乎使用 ascii 等效项 - 所以 11 是 ';',12 是 '<', ETC。)

最奇怪的是,上面代码示例中的前四行似乎影响了结果。从逻辑上讲,这些陈述应该没有影响,但如果我将它们注释掉或删除它们,问题就会消失。

有任何想法吗?还有其他人可以复制吗?

笔记:

  • 我尝试过 php 5.3.1 和 5.3.2,两者的行为方式相同
  • 上面的脚本工作正常,即使在浏览器中,在重新启动 Apache 后刷新 5-6 次页面。然后,如上所述,错误返回
4

2 回答 2

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 回答
0

尝试在代码上方添加setlocale(LC_ALL, 'en_US');

于 2010-06-08T21:02:03.983 回答