[perl] Perl에서 UTF-8을 어떻게 출력 할 수 있습니까?

“utf8″pragma를 사용하여 Perl 스크립트를 작성하려고하는데 예상치 못한 결과가 나타납니다. Mac OS X 10.5 (Leopard)를 사용하고 있으며 TextMate로 편집하고 있습니다. 내 편집기와 운영 체제에 대한 모든 설정은 기본적으로 utf-8 형식으로 파일을 작성하도록되어 있습니다.

그러나 텍스트 파일에 다음을 입력하고 “.pl”로 저장하고 실행하면 ASCII가 아닌 문자 대신 친숙한 “물음표가있는 다이아몬드”가 표시됩니다.

#!/usr/bin/env perl -w

use strict;
use utf8;

my $str = 'Çirçös';
print( "$str\n" );

내가 뭘 잘못하고 있는지 아십니까? 출력에서 ‘Çirçös’를 기대하지만 대신 ‘ ir s’를 얻습니다.



답변

use utf8;유니 코드 출력을 활성화하지 않습니다 . 프로그램에 유니 코드를 입력 할 수 있습니다. 당신의 print()진술 앞에 이것을 프로그램에 추가하십시오 :

binmode(STDOUT, ":utf8");

도움이되는지 확인하십시오. STDOUT일반 ASCII 대신 UTF-8로 출력 해야합니다 .


답변

open pragma를 사용할 수 있습니다 .

예를 들어. 아래는 UTF-8을 사용하도록 STDOUT, STDIN 및 STDERR을 설정합니다 ….

use open qw/:std :utf8/;


답변

TMTOWTDI 는 작업 방식에 가장 적합한 방법을 선택했습니다. 환경 방법을 사용하므로 생각할 필요가 없습니다.

에서 환경 :

export PERL_UNICODE=SDL

상의 명령 행 :

perl -CSDL -le 'print "\x{1815}"';

또는 binmode 사용 :

binmode(STDOUT, ":utf8");          #treat as if it is UTF-8
binmode(STDIN, ":encoding(utf8)"); #actually check if it is UTF-8

또는 PerlIO 사용 :

open my $fh, ">:utf8", $filename
    or die "could not open $filename: $!\n";

open my $fh, "<:encoding(utf-8)", $filename
    or die "could not open $filename: $!\n";

또는 open pragma 사용 :

use open ":encoding(utf8)";
use open IN => ":encoding(utf8)", OUT => ":utf8";


답변

또한 코드의 문자열은 utf-8이라고 말하고 싶습니다. 최신 Perl은 기본적으로 UTF-8을 사용하지 않는 이유를 참조하십시오 . . 그래서 설정 PERL_UNICODE=SDAL뿐만 아니라 PERL5OPT=-Mutf8.


답변

감사합니다. 마침내 코드 전체에 utf8 :: encode를 넣지 않는 해결책을 찾았습니다. utf8에서 파일 쓰기 및 읽기와 같은 다른 경우를 합성하고 완료하고 utf8에서 YAML 파일의 LoadFile과 함께 작동합니다.

use utf8;
use open ':encoding(utf8)';
binmode(STDOUT, ":utf8");

open(FH, ">test.txt");
print FH "something éá";

use YAML qw(LoadFile Dump);
my $PUBS = LoadFile("cache.yaml");
my $f = "2917";
my $ref = $PUBS->{$f};
print "$f \"".$ref->{name}."\" ". $ref->{primary_uri}." ";

여기서 cache.yaml은 다음과 같습니다.

---
2917:
  id: 2917
  name: Semanário
  primary_uri: 2917.xml


답변

쉘에서 수행하십시오 : $ env | grep LANG

이것은 아마도 쉘이 utf-8 로케일을 사용하지 않는다는 것을 보여줄 것입니다.


답변