2014-03-12 109 views
2

在Windows上,根據當前配置的代碼頁和控制檯字體解釋PHP命令行腳本的輸出。在西歐,這通常默認爲850位圖。這意味着,一個腳本寫爲UTF-8(因爲PHP的事實上的標準/ 5.4):在Windows命令提示符下顯示UTF-8輸出

<?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

要在Windows控制檯中正確支持多字節Unicode,它們必須與低級控制檯API交互。 AFIAK,Java和Node.js已經這樣做了,Python有一個嵌入式模塊來啓用它。如果你沒有直接使用PHP的話,那麼我想你可以用一種支持PHP的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); 
} 
相關問題