2011-03-19 3 views
7

Perl 및 Encoding pragma에 문제가 있습니다.Perl에서 encoding pragma UTF 문자열을 사용합니다.

은 (I 입력, 출력, 모든 곳에서 UTF-8을 사용, 펄 스크립트 자체는. 나는 다른 인코딩, 결코 이제까지를 사용하지 않습니다.) 그러나

. 내가

binmode(STDOUT, ':utf8'); 
use utf8; 
$r = "\x{ed}"; 
print $r; 

을 쓸 때 나는 (- 무엇 U + 00ED 유니 코드 문자입니다 내가 원하는 것입니다) 문자열 "í"을 참조하십시오. 그러나 이런 "사용 인코딩"pragma를 추가하면

binmode(STDOUT, ':utf8'); 
use utf8; 
use encoding 'utf8'; 
$r = "\x{ed}"; 
print $r; 

나는 모두 상자 문자입니다. 왜? 나는 데이터 : 덤퍼를 추가하고 덤퍼 내가 그 펄 "\x{fffd}"에 문자열을를 변경 볼이

binmode(STDOUT, ':utf8'); 
use utf8; 
use encoding 'utf8'; 
$r = "\x{ed}"; 
use Data::Dumper; 
print Dumper($r); 

같은 새 문자열을 인쇄 할 수 있도록 또한

. 왜?

+1

참조 : http://stackoverflow.com/questions/492838/why-do-my-perl-tests-fail-with-use-encoding-utf8 –

답변

9

use encoding 'utf8'가 깨졌습니다. \x{ed}을 코드 포인트 U + 00ED로 해석하는 대신이 코드를 단일 바이트 237로 해석 한 다음 이것을 UTF-8로 해석하려고 시도합니다. 어느 쪽이 실패했는지, 그래서 대체 문자 U + FFFD로 바뀌 었습니다. 문자 그대로 " "입니다.

소스가 UTF-8로 지정되도록 use utf8을 지정하고 파일 핸들링에 인코딩을 지정하려면 binmode 또는 open pragma으로 고정하십시오.

+0

오 ... 확인. 나는 재 해석의 이유를 이해한다고 주장 할 수는 없지만 펄에 훨씬 더 이상한 것들이있다. 감사합니다. –

+3

제가 말할 수있는 한,'use encoding'은 사람들이'use encoding 'euc-jp'를 쓸 수 있도록 설계 되었기 때문입니다; $ r = "\ xF1 \ xD1 \ xF1 \ xCC"; 그리고 그것을 "올바르게"해석하십시오. 하지만 그것은'$ r = "\ xC3 \ xAD";와 같은 스타일로 UTF-8 문자열을 작성해야한다는 것을 의미합니다.'$ r = "\ x {200b}";와 같은 UTF-8에 대한 Perl 네이티브 지원과 함께 사용하면 코드 0x80-0xff의 이스케이프는 코드 0x100 이상의 이스케이프와 다르게 해석됩니다. – Anomie

+3

네, 8 비트 로케일 ('use encoding','use locale')에 대한 Perl의 지원은 매우 긴 막대기의 다른 끝에 보관해야합니다. – hobbs

5

실제 코드는 use encoding도 아니고 use utf8도 올바르게 실행되지 않아도됩니다.이 코드는 인코딩 레이어가 STDOUT 인 유일한 방법입니다.

binmode(STDOUT, ":utf8"); 
print "\xed"; 

은 원하는대로 수행하는 동등한 유효 프로그램입니다.

use utf8은 프로그램의 리터럴 문자열에 UTF-8이있는 경우에만 사용해야합니다. 당신이

my $r = "í"; 

을 쓴 경우 다음 use utf8는 해당 문자열은 단일 문자 U + 00ED 대신 바이트 C3 광고의 시리즈로 해석하게한다.

use encoding은 특히 유니 코드를 좋아하는 사람이 사용하지 마십시오. stdin/out의 인코딩을 변경하려면 -C 또는 PERLUNICODE을 사용하거나 binmode를 사용해야하며 다른 핸들을 인코딩 레이어로 자동 열려면 useopen을 사용해야합니다.

+0

hobbs : 예, 정규식의 코드에 실제 UTF-8 리터럴이 있습니다. 감사. –

관련 문제