2011-03-01 3 views
3
#!/usr/bin/env perl 
use warnings; 
use 5.012; 
use Encode qw(encode); 

no warnings qw(utf8); 

my $c = "\x{ffff}"; 

my $utf_8 = encode('utf-8', $c); 
my $utf8 = encode('utf8', $c); 

say "utf-8 : @{[ unpack '(B8)*', $utf_8 ]}"; 
say "utf8 : @{[ unpack '(B8)*', $utf8 ]}"; 

# utf-8 : 11101111 10111111 10111101 
# utf8 : 11101111 10111111 10111111 

"utf-8"은 내 코드 점을 자동으로 마지막 코드 가능 점 (첫 번째 평면)으로 수정하기 위해이 코드를 인코딩합니까?"utf-8"-behavior에 관한 질문

답변

7

Encode 문서의 UTF-8 vs. utf8 vs. UTF8 section을 참조하십시오.

요약하면 Perl에는 두 가지 UTF-8 인코딩이 있습니다. 기본 인코딩은 utf8이며 기본적으로 유니 코드 표준이 해당 코드 포인트에 대해 말하는 것과 관계없이 모든 코드 포인트를 허용합니다.

다른 인코딩은 utf-8 (a.k.a. utf-8-strict)이라고합니다. 유니 코드 표준에 의해 지정된 코드 포인트 만 허용됩니다.

\x{FFFF}은 유니 코드에 따라 유효한 코드 포인트가 아닙니다. 그러나 Perl의 utf8 인코딩은 신경 쓰지 않습니다.

기본적으로 encode 함수는 대상 문자 세트에 존재하지 않는 문자를 대체 문자 (대체 문자 : Handling Malformed Data section 참조)로 바꿉니다. utf-8의 경우 해당 대체 문자는 U+FFFD (REPLACEMENT CHARACTER)이며 UTF-8로 11101111 10111111 10111101 (2 진수)으로 인코딩됩니다.

+0

** 사실이 아닙니다 ** U + FFFF는 유니 코드에 따라 유효한 코드 포인트가 아닙니다. 당연하지; 그것은 단순히 교환을위한 불법입니다. ** 이것은 매우 다른 것들입니다. **이 버그는 최근의 evelopment 릴리즈에서 수정되어'perl -wE '는 "\ x {FFFF}"= ~ /^.$/ || 0 '은 1을 들으며 1을 생성합니다. – tchrist