2017-05-18 1 views
8

Windows의 경우 콘솔에 기본 그림 이모티콘이 있으므로 입력 할 때 흑백 글리프가 표시됩니다. 또는 입니다. PowerShell 또는 C# 콘솔 응용 프로그램이나 Python에서 문자열을 출력 할 수 있으며 그 문자는 모두 충분히 정밀하게 표시됩니다.Node.js의 콘솔에 이모티콘을 출력하는 방법 (Windows)?

그러나 Node.js에서 표시 할 그림 이모티 (예 : ) 만 가져올 수 있지만 대신 이 표시됩니다. 그러나 문자가 throw 인 문자열은 올바르게 표시됩니다. 내가 위의 스크립트를 실행하는 경우

console.log(' ☕ '); 
throw ' ☕ '; 

는, 출력은

� ☕ 

C:\Code\emojitest\emojitest.js:2 
throw ' ☕ '; 
^ 
    ☕ 

어쨌든 있다는 것입니다 I 출력 할 수있는 오류를 throw하지 않고 제대로 그 이모티콘? 아니면 표준 Node.js API를 통해 사용할 수있는 것 외에 예외가 발생합니까?

+2

흠, 다른 사람보다 훨씬 많은 것을 얻었습니다. 글리프를 지원하는 글꼴을 찾는 것이 가장 큰 장애물입니다. 그러나 는 인코딩 문제이며 스크롤 글리프가 상위 비트 평면에 있기 때문에 전혀 이상하지는 않지만 커피 컵은 그렇지 않습니다. 당신은 아마도 stderr에 렌더링 될 때 왜 괜찮은지에 초점을 맞추어야합니다. 예를 들어 'throw'에서처럼 보이지만 stdout에서는 그렇지 않을 것입니다. –

+0

@HansPassant는'stderr'에 직접 쓰는 것이'stdout'에 직접 쓰는 것과는 다른 일을하지 않습니다. 아마도 Node.js가 던지는 것을 다루는 방법을 찾아야 할 것입니다 ... – bdukes

+0

Windows와 같은 것 같습니다. 그것은 내 맥에서 잘 작동합니다. – hasen

답변

6

변경하지 않고 libuv으로 변경하지 못할 수도 있습니다. Windows (또는 콘솔)에서 stdout 또는 stderr에 쓰고 스트림이 TTY 인 경우 libuv은 UTF-8에서 UTF-16으로 자체 변환합니다. 이렇게하면 대리자 쌍을 출력하는 것을 명시 적으로 거부하며 대체 문자 대신에 U+FFFD & # xFFFD; BMP를 능가하는 모든 코드 포인트.

/* We wouldn't mind emitting utf-16 surrogate pairs. Too bad, the */ 
    /* windows console doesn't really support UTF-16, so just emit the */ 
    /* replacement character. */ 
    if (utf8_codepoint > 0xffff) { 
    utf8_codepoint = UNICODE_REPLACEMENT_CHARACTER; 
    } 

throw 메시지가 올바르게 표시 윈도우 (서로 게이트 쌍을 방출 않는) MultiByteToWideChar()와 UTF-16 UTF-8에서 변환을 수행 노드가 수 있기 때문에 메시지를 쓰기 전에 : 여기

uv/src/win/tty.c에서 범인의 콘솔에. ( PrintErrorString() in src/node.cc를 참조하십시오.)

+0

좋은 소리입니다. 문제의 누락 된 세부 사항은 아마도 OP가 Win10을 사용한다는 것입니다. 이 버전의 콘솔에서 많은 수정 작업이 이루어졌으며 주로 새 Linux 하위 시스템에 대한 지원이 확장되었습니다. –

+0

그래서'libuv' (BMP를 넘어서 코드 포인트를 받아 들여'MultiByteToWideChar'를 사용합니다)가 Windows 10에서 작동합니까? - 유효한 기능 요청처럼 들립니다. –

+0

@Hugues Moreau : _libuv_를 수정하여 UTF-16 서로 게이트 쌍을 출력하면이를 지원하는 Windows 콘솔의 Node 스트림에 비 BMP 문자를 표시 할 수 있다고 가정합니다. 특히'MultiByteToWideChar()'를 사용할 필요는 없습니다. 여기에 표시된 코드 행을 삭제 한 후 다음 블록에 'else'를 추가하여 코드 포인트에 대한 서로 게이트 쌍을 생성하면 충분합니다. 하지만 Node.js를 구축하기위한 환경 (또는 오늘 또는 성향을 만드십시오!)을 사용해 본 적이 없습니다. –

2

(부인 성명 : 나는 해결책이없는, 내가 인쇄 이모티콘 관련하여 특별한 예외 처리를 만드는 것 을 탐구, 나는 윈도우 10에있는 도구 - 약간의 행운과 함께 그 수도 어떤 문제를 밝혀 내고 해결책을 찾는다.)

다른 Windows API에 대한 Windows 호출에 대한 노드의 예외보고 코드와 비슷하게 유니 코드를 더 잘 지원하는 것처럼 보입니다.

의 노드 7.10 소스와 보자 :

ReportExceptionAppendExceptionLinePrintErrorString

PrintErrorString에서 Windows-특정 섹션 detects output type (tty/console or not) : - 비 TTY/콘솔 컨텍스트가 인쇄됩니다 stderr (예 : 파일로 리디렉션하는 경우) - cmd 콘솔 (리디렉션 없음)에서 convert12335의 텍스트이고 passWriteConsoleW()입니다.

내가 ConEmu를 사용하여 프로그램을 실행하면 (유니 코드 & 이모티콘 작업 표준 cmd을 받고보다 쉽게 ​​- 그래 난 여기에 조금 게으른있어), 나는 당신이 본 것과 비슷한 참조 : console.log이 이모티콘을 인쇄 실패를하지만, 예외 메시지에서 그림이 잘 인쇄됩니다 (심지어 스크롤 글리프).

모든 출력을 파일 (node test.js > out.txt 2>&1, 예 : Windows cmd에서도 작동 함)로 리디렉션하면 두 경우 모두 "깨끗한"유니 코드를 얻게됩니다.

Windows 콘솔에서 프로그램이 stdout 또는 stderr으로 인쇄 될 때 콘솔이 인쇄하기 전에 일부 (나쁜) 다시 코딩 작업을 수행하는 것처럼 보입니다. 프로그램이 Windows 콘솔 API를 직접 (MultiByteToWideChar으로 변환 한 다음 WriteConsoleW()으로 콘솔에 쓰는 경우) 콘솔을 사용하면 콘솔에 영광스러운 변경되지 않은 이모티콘이 표시됩니다.

JS 프로그램이 console API를 사용하여 물건을 기록 할 때 노드가 콘솔을 감지 (Windows에서)하려고 시도했을 때 예외를보고 할 때와 똑같이 할 수 있습니다. libuv에서 실제로 일어나고있는 것을 설명하는 @BrianNixon's answer을 참조하십시오.

관련 문제