【问题标题】:Display UTF-8 output on Windows command prompt在 Windows 命令提示符下显示 UTF-8 输出
【发布时间】:2014-04-16 10:42:46
【问题描述】:

在 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 源的正确输出,无论本地代码页如何,字体除外。)

【问题讨论】:

  • 为了在 Windows 控制台中正确支持多字节 Unicode,它们必须与低级控制台 API 交互。 AFIAK、Java 和 Node.js 已经做到了这一点,Python 有一个插件模块可以启用它。如果您直接使用 PHP 没有运气,那么我想您可以使用支持语言编写一个包装器,从 PHP 获取 UTF-8 并正确呈现它。

标签: php windows command-line utf-8


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-26
    • 2013-06-21
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    相关资源
    最近更新 更多