在 Windows 上,PHP 命令行脚本的输出根据当前配置的代码页和控制台字体进行解释。在西欧,这通常默认为 850和位图。这意味着以 UTF-8(自 PHP/5.4 以来的事实上的标准)编写的脚本:
<?php
echo 'Café: 1,25 €' . PHP_EOL;
...通常看起来像这样:
C:\tmp>php test.php
Caf├®: 1,25 Ôé¼
usual workaround是使用 *.bat
包装器:
@echo off
chcp 65001 > NUL
php test.php
它不能解决字体问题,但通常已经足够了。
我的双重问题:
是否可以在 PHP 中设置代码页,以便我们可以省略包装器? (使用程序执行函数来运行
chcp
不起作用,因为它发生在不同的进程中。)这是 PHP 使用的控制台库的限制吗? (Node.js 脚本始终显示来自 UTF-8 源的正确输出,无论本地代码页如何,字体除外。)
最佳答案
回答你的问题1:
您可以尝试iconv 。请注意,通过这种方式,您可以更改输出的编码,而不是控制台代码页。但是,它会导致控制台和脚本输出的编码相同,这一点很重要(请参阅此 post ):
iconv("UTF-8", "CP1252", $data); // copied from example on php.net
将其包装在函数中可以为您提供非常方便的工具来将字符串输出到控制台:
function message($string)
{
iconv("UTF-8", "CP1252", $string);
}
所以代替:
echo $string;
用途:
message($string);
您可以通过从代码中获取当前控制台代码页来更进一步:
function getCodePage()
{
$consoleEncoding = explode(":", exec("chcp"));
return trim($consoleEncoding[1]);
}
这使您可以更改message
函数,以便脚本始终使用正确的代码页:
function message($string)
{
iconv("UTF-8", "CP" .getCodePage(), $string);
}
关于php - 在 Windows 命令提示符上显示 UTF-8 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22349129/