'use utf8;'사용 나에게 '넓은 글자 인쇄'제공


86

다음 Perl 프로그램을 실행하면 :

perl -e 'use utf8; print "鸡\n";'

이 경고가 나타납니다.

Wide character in print at -e line 1.

이 Perl 프로그램을 실행하면 :

perl -e 'print "鸡\n";'

나는 경고를받지 않는다.

use utf8Perl 스크립트에서 UTF-8 문자를 사용해야 한다고 생각했습니다 . 이것이 작동하지 않는 이유는 무엇이며 어떻게 해결할 수 있습니까? Perl 5.16.2를 사용하고 있습니다. 이것이 명령 줄에서 하나의 라이너가 아닌 파일에 있으면 동일한 문제가 있습니다.


3
"왜 작동하지 않습니까?" 그것은 않는 일을하지만, 매우 깨진 프로그램의 많은이가 밖으로 있다는 것을 유니 코드와 내 경험이었다 보면 그들이 같은이 노력하고 있습니다. 한 가지를 고쳐서 코드를 약간 덜 잘못 만들면 결과가 훨씬 더 나빠 보입니다. 모든 것이 다시 좋아 보이는 것은 마지막 부분을 고칠 때만 입니다.
hobbs 2013 년

답변:


110

use utf8Perl이 없으면 문자열을 단일 바이트 문자 시퀀스로 해석합니다. 다음에서 볼 수 있듯이 문자열에는 4 바이트가 있습니다.

$ perl -E 'say join ":", map { ord } split //, "鸡\n";'
233:184:161:10

처음 세 바이트는 캐릭터를 구성하고 마지막 바이트는 줄 바꿈입니다.

에 대한 호출 print은이 4 개의 문자를 STDOUT 에 보냅니다. 그러면 콘솔이 이러한 문자를 표시하는 방법을 알아냅니다. 콘솔이 UTF8을 사용하도록 설정되어 있으면이 3 바이트를 단일 문자로 해석하여 표시됩니다.

utf8모듈 을 추가하면 상황이 달라집니다. 이 경우 Perl은 문자열을 두 문자로 해석합니다.

$ perl -Mutf8 -E 'say join ":", map { ord } split //, "鸡\n";'
40481:10

기본적으로 Perl의 IO 계층은 단일 바이트 문자로 작동한다고 가정합니다. 따라서 다중 바이트 문자를 인쇄하려고 할 때 Perl은 무언가 잘못되었다고 생각하고 경고를 표시합니다. 를 포함하여이 오류에 대한 자세한 설명을 얻을 수 있습니다 use diagnostics. 다음과 같이 표시됩니다.

(S utf8) Perl은 예상치 못한 와이드 문자 (> 255)를 만났습니다. 이 경고는 기본적으로 I / O (인쇄 등)에 대해 설정됩니다. 이 경고를 끄는 가장 쉬운 방법은 출력에 : utf8 레이어를 추가하는 것입니다 (예 : binmode STDOUT, ': utf8'). 경고를 끄는 또 다른 방법은 'utf8'경고를 추가하지 않는 것입니다. 그러나 그것은 종종 부정 행위에 더 가깝습니다. 일반적으로 파일 핸들을 인코딩으로 명시 적으로 표시해야합니다. open 및 perlfunc / binmode를 참조하십시오.

다른 사람들이 지적했듯이 Perl에게 멀티 바이트 출력을 허용하도록 지시해야합니다. 이를 수행하는 방법에는 여러 가지가 있습니다 ( 몇 가지 예 는 Perl 유니 코드 자습서 참조 ). 가장 간단한 방법 중 하나는 -CS명령 줄 플래그 를 사용하는 것입니다.이 플래그는 3 개의 표준 파일 핸들 (STDIN, STDOUT 및 STDERR)에 UTF8을 처리하도록 지시합니다.

$ perl -Mutf8 -e 'print "鸡\n";'
Wide character in print at -e line 1.
鸡

vs

$ perl -Mutf8 -CS -e 'print "鸡\n";'

유니 코드는 크고 복잡한 영역입니다. 보시다시피 많은 간단한 프로그램이 올바른 일을 수행하는 것처럼 보이지만 잘못된 이유가 있습니다. 이 프로그램의 수정 부분에 시작할 때 고정 할 때까지, 일이 종종 악화됩니다 모든 프로그램을.


-Mutf8하나의 라이너 펄이 아닌 경우 철자법은 무엇입니까?
Lei Yang

@LeiYang :use utf8;
데이브 크로스

80

use utf8;Perl에게 소스 코드가 UTF-8을 사용하여 인코딩되었음을 알리는 것이 전부 입니다. Perl에게 텍스트 인코딩 방법을 알려줘야합니다.

use open ':std', ':encoding(UTF-8)';

감사합니다, 이것은 @DaveCross의 답변이 다루는 명령 줄의 한 줄과 달리 파일에 저장된 프로그램에서 잘 작동합니다.
vktec


14

CPAN 모듈을 사용하여 "just do utf8 anywhere"에 가까워 질 수 있습니다 utf8::all.

perl -Mutf8::all -e 'print "鸡\n";'

print인쇄 할 수없는 항목 ( :encoding레이어가 제공 되지 않은 경우 255보다 큰 문자)을 수신 하면 UTF-8을 사용하여 인코딩하려한다고 가정합니다. 문제에 대한 경고 후 그렇게합니다.


5

이것을 사용할 수 있습니다.

perl -CS filename.

또한 해당 오류를 종료합니다.


이것이 도움이되었습니다
muenalan

0

스페인어에서 다음을 사용할 때이 오류를 찾을 수 있습니다.

use utf8;

편집기 인코딩이 다른 인코딩으로되어 있습니다. 따라서 편집기에서 보는 것은 Perl이하는 것이 아닙니다. 이 오류를 해결하려면 편집기 인코딩을 Unicode / UTF-8 로 변경하십시오 .


1
아니요. 이것이 오류의 원인이 아닙니다. 코드는 모두 UTF8로 올바르게 인코딩되었지만 출력 파일 핸들은 그 사실을 알지 못했습니다.
Dave Cross
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.