>  기사  >  백엔드 개발  >  PHP는 mb_substr()을 사용하여 중국어 문자열 가로채기와 문자 깨짐 문제를 해결합니다.

PHP는 mb_substr()을 사용하여 중국어 문자열 가로채기와 문자 깨짐 문제를 해결합니다.

伊谢尔伦
伊谢尔伦원래의
2016-11-26 14:43:094018검색

PHP에는 여러 문자열 차단 기능이 포함되어 있으며 그 중 substr 및 mb_substr이 일반적으로 사용됩니다. 전자가 중국어를 처리할 때 GBK는 2길이 단위이고, UTF는 3길이 단위이다. 후자는 인코딩을 지정한 후 한자 1자가 1길이 단위가 된다.

mb_substr 사용법

string mb_substr( string$str, int$start[, int$length[, string$encoding]] );

mb_substr 문자 수에 따라 멀티바이트 안전 substr() 작업을 수행합니다. str의 시작 위치에서 계산됩니다. 첫 번째 문자는 위치 0에 있습니다. 두 번째 문자의 위치는 1입니다.

str 가로채는 상위 문자열입니다.

시작 위치를 시작합니다.

length 반환되는 문자열의 최대 길이입니다. 생략할 경우 str의 끝 부분까지 잘립니다.

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

그런 다음 다음 코드를 사용하여 이 문제를 완료할 수 있습니다.

$mess=mb_substr($message,0,19,'gb2312');

gb2312는 중국어 인코딩 형식입니다.

mb_substr은 중국어와 영어가 혼합된 문자열을 처리합니다.

substr은 때때로 중국어의 1/3 또는 중국어의 절반을 잘라내고 문자가 왜곡되어 표시되는 경우가 있습니다. 상대적으로 말하면 mb_substr이 우리 사용에 더 적합합니다. 그러나 때로는 mb_substr이 그다지 유용하지 않은 것 같습니다. 예를 들어 작은 그림의 간략한 정보를 표시하고 싶다면 한자는 5자가 딱 맞고, 5자가 넘으면 처음 4자를 가로채서 "..."만 추가하면 됩니다. 중국어이지만 영어나 숫자를 처리할 때 이 차단이 너무 짧습니다. 이 문제는 다음 기능을 사용하여 해결할 수 있습니다:

<?php
/**
* 字符串截取
*
* @author gesion
* @param string $str 原始字符串
* @param int    $len 截取长度(中文/全角符号默认为 2 个单位,英文/数字为 1。
*                    例如:长度 12 表示 6 个中文或全角字符或 12 个英文或数字)
* @param bool   $dot 是否加点(若字符串超过 $len 长度,则后面加 "...")
* @return string
*/
class Onens {
   public static function g_substr($str, $len = 12, $dot = true) {
       $i = 0;
       $l = 0;
       $c = 0;
       $a = array();
       while ($l < $len) {
           $t = substr($str, $i, 1);
           if (ord($t) >= 224) {
               $c = 3;
               $t = substr($str, $i, $c);
               $l += 2;
           } elseif (ord($t) >= 192) {
               $c = 2;
               $t = substr($str, $i, $c);
               $l += 2;
           } else {
               $c = 1;
               $l++;
           }
           // $t = substr($str, $i, $c);
           $i += $c;
           if ($l > $len) break;
           $a[] = $t;
       }
       $re = implode(&#39;&#39;, $a);
       if (substr($str, $i, 1) !== false) {
           array_pop($a);
           ($c == 1) and array_pop($a);
           $re = implode(&#39;&#39;, $a);
           $dot and $re .= &#39;...&#39;;
       }
       return $re;
   }
}


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