在Windows命令提示符下显示UTF-8输出

时间:2014-03-12 10:49:40

标签: php windows command-line utf-8

在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

它不能解决字体问题,但通常情况下还不错。

我的双重问题:

  1. 是否可以在PHP中设置代码页,以便我们可以省略包装器? (使用程序执行函数运行chcp不起作用,因为它发生在不同的进程中。)

  2. 这是PHP使用的控制台库的限制吗? (Node.js脚本始终显示来自UTF-8源的正确输出,无论本地代码页,字体除外。)

1 个答案:

答案 0 :(得分:2)

回答你的问题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);
}