개발 꿀팁/PHP

php 영문 문자열 길이 계산

Jammie 2022. 8. 1. 14:42
반응형

php에서 흔히 볼 수 있는 문자열 길이를 계산하는 함수는 strlen과 mb_strlen이며, 다음은 이 두 함수의 비교 설명(부호화 방식 UTF8)이다.

1.strlen과 mb_strlen 비교
문자가 모두 영어일 때,양자는 같다.여기에서 주로 중국어와 영어를 섞어서 배열할 때, 두 개의 계산 결과를 비교해 보자.(테스트 시 인코딩 방식은 UTF8)

<?php 
$str='중국어 a자 1부자'; 
echo strlen($str); 
echo '<br />'; 
echo mb_strlen($str,'UTF8'); 
//결과를 출력하다
//14 
//6 
?>

결과분석: strlen 계산 시 UTF8 1개의 중국어 문자는 3개의 길이이므로 "중국어 a자 1부자"의 길이는 3*4+2=14입니다.
mb_strlen 계산시 UTF8로 내부코드를 선택하면 한문자를 길이1로 계산하므로 '한문a자1부'의 길이는 6입니다.
2.중국어와 영어 혼재 문자열의 자리 표시자 계산:
이 두 함수를 이용하면 한 개의 중국어와 중국어가 혼재되어 있는 문자열의 점유율이 얼마인지(한 문자의 점유율은 2, 영문자는 1)를 조합하여 계산할 수 있다.: 만약 문자열에 중국어 a, 영어 b가 있다면:

<?php 
$str='중국어 a자 1부자'; 
//계산은 아래와 같다
echo (strlen($str) + mb_strlen($str,'UTF8')) / 2; 
echo 
//결과를 출력하다
//10 
?>

예를 들어 '중국어 a자 1부자'의 strlen($str) 값이 14, mb_strlen($str) 값이 6이면 '중국어 a자 1부자'의 자리수를 10으로 계산할 수 있다.

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.ini에 php_mbstring.dll이 로드되어 있는지, 즉 "extension=php_mbstring.dll" 라인이 존재하고 주석되지 않았는지 확인해야 하며, 그렇지 않으면 함수가 정의되지 않은 문제가 발생할 수 있습니다

 

반응형