>  기사  >  백엔드 개발  >  PHP에서 strlen과 mb_strlen의 차이점을 알고 계십니까?

PHP에서 strlen과 mb_strlen의 차이점을 알고 계십니까?

怪我咯
怪我咯원래의
2017-07-13 14:48:031654검색

php에서 string의 길이를 계산하는 일반적인 함수strlen과 mb_strlen입니다. 문자가 모두 영문이면 동일합니다. 여기서는 주로 중국어와 영어가 혼합된 경우의 두 가지 계산 결과를 비교합니다.

PHP에서 strlen과 mb_strlen은 문자열의 길이를 구하는 함수입니다.

strlen() 함수는 성공하면 문자열의 길이를 반환합니다. 0을 반환합니다.

mb_strlen — 문자열의 길이를 가져옵니다.

Syntax

mb_strlen ($str, $encoding)

str 길이를 확인할 문자열입니다.

encoding 매개변수는 문자 인코딩입니다. 생략하면 내부 문자 인코딩이 사용됩니다.

반환 값

인코딩 인코딩을 사용하여 문자열 str에 포함된 문자 수를 반환합니다. 멀티바이트 문자는 1로 계산됩니다.

주어진 인코딩이 유효하지 않으면 FALSE를 반환합니다.

다음은 둘의 차이점을 설명하기 위한 예입니다.

예제를 먼저 보세요:

<?php 
//测试时文件的编码方式要是UTF8 
$str=&#39;中文a字1符&#39;; 
echo strlen($str).&#39;<br>&#39;;//14 
echo mb_strlen($str,&#39;utf8&#39;).&#39;<br>&#39;;//6 
echo mb_strlen($str,&#39;gbk&#39;).&#39;<br>&#39;;//8 
echo mb_strlen($str,&#39;gb2312&#39;).&#39;<br>&#39;;//10 
?>

결과 분석: strlen을 계산할 때 UTF8 한자는 3개의 길이로 처리되므로 "한자 1자"의 길이는 3*4+2=14로 계산됩니다. in mb_strlen 내부 코드를 UTF8로 선택하면 한자의 길이가 1로 계산되므로 "한자 1자"의 길이는 6이 됩니다.

이 두 함수를 이용하면 한자를 합하여 계산할 수 있습니다. 및 영어 혼합 배열된 문자열에 대한 자리 표시자는 무엇입니까(한자 자리 표시자는 2이고 영어 문자 자리 표시자는 1입니다)

echo (strlen($str) + mb_strlen($str,&#39;UTF8&#39;)) / 2;

예를 들어 "한자 a 문자 1의 strlen($str) 값 문자"가 14이고 mb_strlen($str) 값이 6이면 "한자 1자"의 점유율은 10이라고 계산할 수 있습니다.

echo mb_internal_encoding();

PHP에 내장된 문자열 길이 함수 strlen은 중국어를 올바르게 처리할 수 없습니다. 문자열이 차지하는 바이트 수만 가져옵니다. GB2312 중국어 인코딩의 경우 strlen으로 얻은 값은 중국어 문자 수의 2배인 반면, UTF-8 인코딩 중국어의 경우 차이는 3배입니다(UTF-8 인코딩에서는 한자 하나가 3바이트를 차지합니다).

mb_strlen 함수를 사용하면 이 문제를 더 잘 해결할 수 있습니다. mb_strlen의 사용법은 문자 인코딩을 지정하는 두 번째 선택적 매개변수가 있다는 점을 제외하면 strlen과 유사합니다. 예를 들어, UTF-8 문자열 $str의 길이를 얻으려면 mb_strlen($str,'UTF-8')을 사용할 수 있습니다. 두 번째 매개변수가 생략되면 PHP의 내부 인코딩이 사용됩니다. 내부 인코딩은 mb_internal_encoding() 함수를 통해 얻을 수 있습니다.

mb_strlen은 PHP의 핵심 기능이 아니라는 점에 유의해야 합니다. 사용하기 전에 php_mbstring.dll이 php.ini에 로드되어 있는지 확인해야 합니다. 즉, "extension= php_mbstring.dll"이 존재하며 코멘트 처리되지 않습니다. 그렇지 않으면 정의되지 않은 함수 문제가 발생합니다.

위 내용은 PHP에서 strlen과 mb_strlen의 차이점을 알고 계십니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.