sprintf ошибка с php и apache в windows? - PullRequest
2 голосов
/ 09 июня 2010

Я столкнулся со странной проблемой при настройке сервера 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». (Обратите внимание, что «:» является следующим символом ascii в последовательности после «9», если $number равен 0-9, все работает. Кажется, что числа больше 10 используют эквиваленты ascii - поэтому 11 - это «;», 12 - это « <'и т. д.) </p>

Самым странным является то, что первые четыре строки в приведенном выше примере кода, похоже, влияют на результаты. Логично, что эти заявления не должны иметь никакого влияния, но если я их закомментирую или удалю, проблема исчезнет.

Есть идеи? Кто-нибудь еще может повторить это?

Примечания:

  • Я пробовал php 5.3.1 и 5.3.2, оба ведут себя одинаково
  • Вышеуказанный скрипт отлично работает, даже в браузере, для обновления 5-6 страниц после перезапуска Apache. Тогда ошибка, как описано, возвращает

Ответы [ 2 ]

0 голосов
/ 09 июня 2010

Попробуйте:

Измените echo "number: $number, string: $string\n"; на:

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

В основном это даст вам числовой код символа для каждого байта в строке.Обратите внимание, что я сказал байт.Если это проблема с набором символов или проблема с байтами Manache в Apache, вы должны увидеть это здесь.Ожидаемый результат: 49 48 46 48.Если вместо этого вы видите 58 46 48, то, возможно, вы действительно нашли ошибку с php и должны отправить отчет об ошибке.Вам также следует попробовать обновить версию php (отсутствует версия 5.3.2) ...

0 голосов
/ 09 июня 2010

Попробуйте добавить это выше кода setlocale(LC_ALL, 'en_US');

...