【发布时间】:2013-08-21 01:38:11
【问题描述】:
我遇到了一个问题,但不知道是 PHP 还是 Windows 的命令行。当 PHP 脚本尝试在加载了 UTF-8 代码页的情况下将 UTF-8 字符回显到 cmd 中时,进程会意外停止。这是一个案例:
test1.php:
<?php
error_reporting( -1 );
echo 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ', "\n";
echo "OK";
?>
test2.php:
<?php
error_reporting( -1 );
echo 'ASCII: ABCDEFGHIJKLMNOPQRSTUVWXYZ', "\n";
echo 'UTF-8: АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ', "\n";
echo 'UTF-8: АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ', "\n";
echo "OK";
?>
(test1.php 和 test2.php 都以 UTF-8 格式保存,没有 BOM。)
命令提示符日志:
e:\tests>chcp 1252
Active code page: 1252
e:\tests>php -f test1.php
АБВГДЕЁЖЗРЙКЛМНОПРСТУФХЦЧШЩЫРЮЯ
OK
e:\tests>php -f test2.php
ASCII: ABCDEFGHIJKLMNOPQRSTUVWXYZ
UTF-8: АБВГДЕЁЖЗРЙКЛМНОПРСТУФХЦЧШЩЫРЮЯ
UTF-8: АБВГДЕЁЖЗРЙКЛМНОПРСТУФХЦЧШЩЫРЮЯ
OK
e:\tests>chcp 65001
Active code page: 65001
e:\tests>php -f test1.php
e:\tests>php -f test2.php
ASCII: ABCDEFGHIJKLMNOPQRSTUVWXYZ
UTF-8: АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ
e:\tests>
在 1252 模式下,所有字符都会得到回显(当然,虽然不正确)。但在 65001 (UTF-8) 模式下,test1 停在第一个字符上,而 test2 停在第二个 UTF-8 行的第一个字符上。
PHP版本是:
PHP 5.4.13 (cli) (built: Mar 15 2013 02:07:14)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
Windows 是 XP SP3。
更新:
1) 如果我将echo 更改为:
$f = fopen( 'php://stdout', 'w' );
fwrite( $f, ... );
...
close( $f );
它有效。
2) 如果我重定向输出:
e:\tests>php -f test1.php > out.log
它也可以工作(echo)。
但是第一种情况有什么问题呢?
【问题讨论】:
-
我想,问题可能出在 cmd 本身,但如果我调用
type test2.php(或任何其他 UTF-8 文件),它就可以了。
标签: php windows command-prompt