2011-03-03 3 views

답변

8

length 함수는 옥텟 (AKA 바이트)이 아닌 문자에 대해 작동합니다. 문자의 정의는 인코딩에 따라 다릅니다. 중국어 문자는 여전히 단일 문자입니다 (인코딩이 올바르게 설정된 경우!). 그러나 한 옥텟 이상의 공간을 차지합니다. 따라서 Perl에서 문자열의 길이는 Perl이 문자열이 있다고 생각하는 문자 인코딩에 따라 다릅니다. 문자 인코딩과 독립적 인 유일한 문자열 길이는 간단한 바이트 길이입니다.

해당 문자열에 UTF-8로 플래그가 지정되고 UTF-8로 인코딩되었는지 확인하십시오. 예를 들어,이 3 산출 :처럼

$ perl -e 'use utf8; print length("长")' 

: : 파일에서 한자를 받고있는 경우

$ perl -e 'use Encode; print length(Encode::decode("utf-8", "长"))' 

것은 확인이 반면

$ perl -e 'print length("长")' 

1을 산출 파일을 읽거나 쓰려면 먼저 파일을 binmode $fh, ':utf8'에 복사하십시오. 데이터베이스에서 데이터를 가져 오는 경우 데이터베이스가 UTF-8 형식의 문자열을 반환하는지 확인하거나 Encode을 사용하여 데이터베이스를 확인하십시오.

UTF-8로 모든 것을 가져야한다고 생각하지 않습니다. 문자열에 올바른 인코딩이 지정되어 있는지 확인하기 만하면됩니다. 전 UTF-8 앞뒤로 (그리고 심지어는 옆으로) 갈 것입니다. 비록 유니 코드를위한 링구아 프랑코이고 어디서나 사용하면 더 쉽게 만들 수 있습니다.

비 ASCII 데이터를 처리하려면 perlunicode 매뉴얼 페이지를 읽는 것이 좋습니다.

+0

이 중국어 문자와 함께 substr 기능을 어떻게 사용합니까? 이제 세 번째 해결 방법으로 적절한 길이를 얻을 수 있지만 어떻게하면 substr을 중국어 문구에 사용할 수 있습니까? 나는 실제로 A와 같은지보기 위해 B의 부분 문자열을 취하는 중국어 단어 (A와 B)의 부분 문자열을 비교하려고 시도하고있다. – syker

+0

@syker :'substr'은 문자 (octects가 아님)에서 작동하므로'substr' 문자열이 올바른 인코딩으로 태그가 지정되면 올바르게 작동해야합니다. 예를 들면 다음과 같습니다 :'perl -e '는 Encode를 사용합니다; binmode STDOUT, ": utf8"; 내 $ s = 인코딩 : : 디코딩 ("UTF - 8", "长 μ"); print substr ($ s, 1, 1), "\ n" ''당신에게 "μ"를 주어야합니다. –

+1

@syker : BTW, 처음 두 예제는 설명하기 쉽습니다. use utf8;은 Perl에게 스크립트 자체가 UTF-8이므로 "长"문자열에 자동으로 UTF-8로 플래그가 지정됩니다. 세 번째는 실생활에서 가장 유용하지만, 모든 Encode 비즈니스가 문자열 길이와 문자열 인코딩 간의 연결을 보여주기를 원하지 않았습니다. –