2014-03-12 4 views
2

Windows에서 PHP 명령 행 스크립트의 출력은 현재 구성된 코드 페이지 및 콘솔 글꼴에 따라 해석됩니다. 서유럽에서는 보통 850비트 맵이 기본값으로 사용됩니다.Windows 명령 프롬프트에서 UTF-8 출력 표시

C:\tmp>php test.php 
Caf├®: 1,25 Ôé¼ 

usual workaround은을 사용하는 것입니다 : 일반적으로이 방법을 볼 것이다

<?php 
echo 'Café: 1,25 €' . PHP_EOL; 

... : 그건 스크립트가 UTF-8 (PHP 이후 사실상의 표준/5.4)과 같이 쓸 것을 의미한다 *.bat 래퍼 :

@echo off 
chcp 65001 > NUL 
php test.php 

이 글꼴 문제가 해결되지 않습니다하지만 일반적으로 충분히 좋다.

내 이중 질문 :

  1. 그렇게 우리는 래퍼를 생략 할 수 PHP 내에서 코드 페이지를 설정할 수 있습니까? (chcp을 실행하는 프로그램 실행 함수를 사용하면 다른 프로세스에서 발생하기 때문에 작동하지 않습니다.)

  2. PHP에서 사용하는 콘솔 라이브러리의 제한 사항입니까? (Node.js를 스크립트는 항상 옆 UTF-8 소스에 상관없이 지역 코드 페이지, 글꼴에서 올바른 출력을 표시합니다.)

+1

: 스크립트가 항상 올바른 코드 페이지를 사용하므로 당신에게 가능성을 제공

function getCodePage() { $consoleEncoding = explode(":", exec("chcp")); return trim($consoleEncoding[1]); } 

message 기능을 변경하는 Windows 콘솔에서 멀티 바이트 유니 코드를 제대로 지원하려면 저수준 콘솔 API와 상호 작용해야합니다. AFIAK, Java 및 Node.js는 이미이 작업을 수행하며 Python에는이를 사용 가능하게하는 드롭 인 모듈이 있습니다. PHP로 직접적으로 운이 없다면 PHP에서 UTF-8을 가져와 올바르게 렌더링하는 지원 언어로 래퍼를 작성할 수 있다고 가정합니다. –

답변

1

대답 질문 1 :

당신은 iconv을 시도 할 수 있습니다. 이 방법으로 콘솔 코드 페이지가 아닌 출력의 인코딩을 변경합니다. 그러나, 그것은 중요 모두 콘솔 및 스크립트 출력의 동일한 인코딩 결과 (본 post) :

function message($string) 
{ 
    iconv("UTF-8", "CP1252", $string); 
} 
을 : 함수에 포장

iconv("UTF-8", "CP1252", $data); // copied from example on php.net 

당신에게 콘솔로 출력 문자열에 매우 편리한 도구를 제공합니다

그래서 대신 :

echo $string; 

사용 :

message($string); 
당신은 당신의 코드에서 현재 콘솔 코드 페이지를 얻어서 더욱 갈 수

:

function message($string) 
{ 
    iconv("UTF-8", "CP" .getCodePage(), $string); 
} 
관련 문제