어떻게 펄 문자열이 내부적으로 표현 되었습니까? 어떤 인코딩이 사용됩니까? 어떻게하면 다른 인코딩을 제대로 처리 할 수 있습니까?Perl 문자열 내부
필자는 오랫동안 perl을 사용 해왔지만 다른 인코딩에서는 많은 문자열 처리를 포함하지 않았고, 인코딩과 관련이있는 사소한 문제가 발생했을 때 나는 보통 무속 행동.
지금까지 필자는 perl 문자열을 바이트 순서로 생각했는데, 이는 필자의 작업에 매우 적합했습니다. 이제 UTF-8로 인코딩 된 파일을 처리해야하는데 여기에서 문제가 발생합니다.
print $contents;
그리고 나는 두 가지를 얻을 :
open(my $in, '<', $ARGV[0]) or die "cannot open file $ARGV[0] for reading";
binmode($in, ':utf8');
my $contents;
{
local $/;
$contents = <$in>;
}
close($in);
다음 간단하게 인쇄 :
는 첫째,이 같은 문자열로 파일을 읽을 경고 Wide character in print at <scriptname> line <n>
및 콘솔에서 쓰레기를. 그래서 펄 문자열은 "넓이"가 될 수있는 "문자"개념을 가지고 있다고 결론을 내릴 수 있습니다. 그러나 인쇄 될 때 이러한 "와이드"문자는 단일 "문자"가 아닌 여러 바이트로 콘솔에 표현됩니다. (왜 지금까지 이진 파일을 사용하여 이전의 모든 경험이 "문자"문제없이 작동하는 것을 기대했던 것일까?)
왜 콘솔에서 가비지가 표시됩니까? perl이 문자열을 문자로 저장하는 경우, 콘솔 인코딩을 찾고 텍스트를 제대로 인쇄하는 데 큰 문제가 없다고 생각합니다. (나는 Windows를 사용한다.)
perl이 가변 폭 문자 시퀀스 (예 : 동일한 UTF-8 인코딩 사용)로 문자열을 저장하는 경우 왜 이렇게 했습니까? 내 C 경험에서 다루는 문자열은 PAIN입니다.
업데이트.
테스트 용 컴퓨터 두 대를 사용합니다. 영어 팩을 설치 한 상태에서 Windows 7 x64를 실행하지만 러시아 국가 별 설정으로 ActivePerl 5.10.1 x64와 함께 cp866를 OEM 코드 페이지로, cp1251을 ANSI로 사용합니다. 다른 하나는 Cygwin Perl 5.10.0을 사용하여 Windows XP 32 비트 러시아어 현지화를 실행합니다.
링크 덕분에 이제는 무슨 일이 일어나고 어떻게해야하는지에 대해 훨씬 더 확실하게 이해할 수있게되었습니다.
다중 바이트 문자열은 가변 폭 인코딩을 의미합니다. – n0rd
어쨌든 왜 변환을 명시 적으로해야합니까? 입력 데이터 인코딩을 지정 했으므로 추가 단계를 수행해야하는 이유는 무엇입니까? – n0rd
입력 인코딩을 지정했습니다. 너는 너를 해. 그런 다음 출력 인코딩을 지정합니다. 내가 언급 한 기사는 더 잘 설명한다. 나는 생각해야한다. – dylan