일관되지 않은 PHP 문자열 길이에 대한 해결 방법: 1. mb_Detect_encoding() 함수를 통해 문자열의 인코딩 방법을 확인합니다. 2. mb_strlen 함수를 통해 특정 문자 길이를 확인합니다. 3. 정규식 "preg_match_all('/[x)을 사용합니다. {4e00 }-x{9fff}]+/u', $str1, $matches);" 중국어가 아닌 문자만 제거하세요.
이 튜토리얼의 운영 환경: Windows 10 시스템, PHP 버전 8.1, DELL G3 컴퓨터
php 문자열 길이가 일치하지 않으면 어떻게 해야 합니까?
php에서 문자열은 같지만 길이가 다른 문제
문제:
그림에 표시된 것처럼 두 개의 동일한 중국어 문자열을 볼 수 있습니다. 에 한눈에 "물류지원부"인데 길이가 하나는 21이고 다른 하나는 15이다.
우선 인코딩 방법이 다르기 때문에 발생한다고 직관적으로 생각하실 수 있습니다.
mb_detect_encoding()
함수를 통해 두 문자열의 인코딩 방법을 확인해보세요. 코드는 다음과 같습니다
<?php header("Content-Type: text/html;charset=utf-8"); $data[0]=$str1="后勤保障部"; $data[1]=$str2="后勤保障部"; var_dump($data); //查看编码方式 $encode1 = mb_detect_encoding($str1, array("ASCII","UTF-8","GB2312","GBK","BIG5")); $encode2 = mb_detect_encoding($str2, array("ASCII","UTF-8","GB2312","GBK","BIG5")); echo "str1='".$str1."'"." 编码:".$encode1."</br>"; echo "str2='".$str2."'"." 编码:".$encode2."</br>"; ?>
하지만 출력 결과는 모두 UTF-8입니다.
이유는 무엇입니까? 출력에서 구체적인 문자 길이를 살펴보겠습니다
<?php header("Content-Type: text/html;charset=utf-8"); $data[0]=$str1="后勤保障部"; $data[1]=$str2="后勤保障部"; var_dump($data); //查看编码方式 $encode1 = mb_detect_encoding($str1, array("ASCII","UTF-8","GB2312","GBK","BIG5")); $encode2 = mb_detect_encoding($str2, array("ASCII","UTF-8","GB2312","GBK","BIG5")); //当mb_strlen的内码选择为UTF-8的时候,则会将中文字符当成一个字符 //strlen,得到的是字符串所占的字节数 echo "str1='".$str1."'".": 字符长度:".mb_strlen($str1).": 字节长度:".strlen($str1)." 编码:".$encode1."</br>"; echo "str2='".$str2."'".": 字符长度:".mb_strlen($str2).": 字节长度:".strlen($str2)." 编码:".$encode2."</br>"; ?>
출력 결과는 다음과 같습니다.
문자열 str1에 한자가 7개 포함되어 있는 것으로 확인되었지만 실제로는 "물류지원부서" 5개만 표시됩니다
차단하여 str1의 마지막 두 글자를 봅니다.
//截取str1后面两个未显示字符 $res=mb_substr($str1, 5,2); echo "最后两字符:".$res."</br>"; echo mb_strlen($res);
는 에코로 표시할 수 없지만 두 글자를 차지합니다.
똑같이 보이는 문자열이 다음과 같은 경우 실제로 동일해야 하기 때문에 처리해야 합니다. 중국어가 아닌 문자를 제거해야 합니다.
//剔除str1字串中未显示的字符(非中文字符) preg_match_all('/[\x{4e00}-\x{9fff}]+/u', $str1, $matches); $str1 = join('', $matches[0]);
마지막으로 코드는 다음과 같습니다
<?php header("Content-Type: text/html;charset=utf-8"); $data[0]=$str1="后勤保障部"; $data[1]=$str2="后勤保障部"; var_dump($data); //查看编码方式 $encode1 = mb_detect_encoding($str1, array("ASCII","UTF-8","GB2312","GBK","BIG5")); $encode2 = mb_detect_encoding($str2, array("ASCII","UTF-8","GB2312","GBK","BIG5")); //当mb_strlen的内码选择为UTF-8的时候,则会将中文字符当成一个字符 //strlen,得到的是字符串所占的字节数 echo "str1='".$str1."'".": 字符长度:".mb_strlen($str1).": 字节长度:".strlen($str1)." 编码:".$encode1."</br>"; echo "str2='".$str2."'".": 字符长度:".mb_strlen($str2).": 字节长度:".strlen($str2)." 编码:".$encode2."</br>"; //截取str1后面两个未显示字符 echo "</br>------------------截取str1后面两个未显示字符---------------------</br>"; $res=mb_substr($str1, 5,2); echo "str1最后两字符: ".$res."</br>"; echo "str1长度: ".mb_strlen($res)."</br>"; //比较 echo "</br>--------------------------相等比较----------------------------------</br>"; echo "str1 与 str2比较: "; echo strcomp($str1,$str2)."</br>"; echo "str2 与 str2比较: "; echo strcomp($str2,$str2)."</br>"; //剔除str1字串中非中文 preg_match_all('/[\x{4e00}-\x{9fff}]+/u', $str1, $matches); $str1 = join('', $matches[0]); echo "</br>---------------------剔除str1字串中非中文后----------------------</br>"; echo "str1='".$str1."'".": 字符长度:".mb_strlen($str1).": 字节长度:".strlen($str1)." 编码:".$encode1."</br>"; echo "str1 与 str2比较: "; echo strcomp($str1,$str2)."</br>"; function strcomp($str1,$str2){ if($str1 == $str2){ return "相等"; }else{ return "不等"; } } ?>
실행 결과
참고:
21- phpmyadmin의 SQL 입력 상자에 str1 바이트를 입력하면 다음과 같이 표시됩니다
글쎄, 단지 두 개의 추가 문자일 뿐입니다
추천 학습: 《PHP Video Tutorial》
위 내용은 PHP 문자열 길이가 일치하지 않는 경우 수행할 작업의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!