use utf8
Perl이 없으면 문자열을 단일 바이트 문자 시퀀스로 해석합니다. 다음에서 볼 수 있듯이 문자열에는 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";'
鸡
유니 코드는 크고 복잡한 영역입니다. 보시다시피 많은 간단한 프로그램이 올바른 일을 수행하는 것처럼 보이지만 잘못된 이유가 있습니다. 이 프로그램의 수정 부분에 시작할 때 고정 할 때까지, 일이 종종 악화됩니다 모든 프로그램을.