Heim  >  Artikel  >  Backend-Entwicklung  >  PHP schneidet chinesische Zeichen ohne verstümmelte Zeichen

PHP schneidet chinesische Zeichen ohne verstümmelte Zeichen

王林
王林Original
2019-09-17 13:03:413784Durchsuche

PHP schneidet chinesische Zeichen ohne verstümmelte Zeichen

Wenn in PHP die Funktion substr() eine chinesische Zeichenfolge abfängt, können verstümmelte Zeichen erscheinen. Dies liegt daran, dass die Anzahl der von einem Byte belegten Bytes in chinesischen und westlichen Zeichen unterschiedlich ist. Der Längenparameter von substr wird in Bytes berechnet. Bei der GB2312-Codierung belegt ein chinesisches Zeichen 2 Bytes und bei der UTF-8-Codierung kann ein chinesisches Zeichen 2 oder 3 Bytes belegen belegt 1 Byte.

Die direkte Verwendung der PHP-Funktion substr zum Abfangen chinesischer Zeichen kann zu verstümmelten Zeichen führen. Der Hauptgrund dafür ist, dass substr ein chinesisches Zeichen gewaltsam in zwei Hälften zerschneiden kann. Lösung:

1. Verwenden Sie die mb_substr-Abfangbibliothek der mbstring-Erweiterungsbibliothek, um verstümmelte Zeichen zu vermeiden.

2. Schreiben Sie die Abfangfunktion selbst, aber die Effizienz ist nicht so hoch wie die Verwendung der mbstring-Erweiterungsbibliothek.

3. Wenn nur die abgefangene Zeichenfolge ausgegeben werden soll, kann dies wie folgt implementiert werden: substr($str, 0, 30).chr(0). Die Funktion

substr() kann Text teilen, wenn der zu teilende Text jedoch chinesische Zeichen enthält, treten häufig Probleme auf. In diesem Fall können Sie die Funktion mb_substr()/mb_strcut verwenden Funktion, mb_substr()/ Die Verwendung von mb_strcut ähnelt substr(), außer dass am Ende von mb_substr()/mb_strcut ein weiterer Parameter hinzugefügt werden muss, um die Codierung der Zeichenfolge festzulegen. Die meisten Server öffnen jedoch nicht php_mbstring.dll, Sie müssen also php_mbstring in php.ini hinzufügen. Die DLL wird geöffnet.

Zum Beispiel:

<?php
echo mb_substr(&#39;这样一来我的字符串就不会有乱码^_^&#39;, 0, 7, &#39;utf-8&#39;);
?>
输出:这样一来我的字
<?php
echo mb_strcut(&#39;这样一来我的字符串就不会有乱码^_^&#39;, 0, 7, &#39;utf-8&#39;);
?>

Ausgabe: so

Wie aus dem obigen Beispiel ersichtlich ist, teilt mb_substr Zeichen nach Wörtern auf, während mb_strcut Zeichen nach Bytes aufteilt, um Zeichen aufzuteilen , aber das Phänomen der Halbzeichen wird nicht erzeugt.

Wie man chinesische Zeichenfolgen ohne verstümmelte Zeichen mit PHP abfängt

function GBsubstr($string, $start, $length) {
if(strlen($string)>$length){
  $str=null;
  $len=$start+$length;
  for($i=$start;$i<$len;$i++){
  if(ord(substr($string,$i,1))>0xa0){
   $str.=substr($string,$i,2);
   $i++;
  }else{
   $str.=substr($string,$i,1);
  }
  }
  return $str.&#39;...&#39;;
}else{
  return $string;
}
}

Wie man chinesische Zeichenfolgen ohne verstümmelte Zeichen abfängt – geeignet für UTF-8

function substr_text($str, $start=0, $length, $charset="utf-8", $suffix="")
{
if(function_exists("mb_substr")){
return mb_substr($str, $start, $length, $charset).$suffix;
}
elseif(function_exists(&#39;iconv_substr&#39;)){
return iconv_substr($str,$start,$length,$charset).$suffix;
}
$re[&#39;utf-8&#39;] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
$re[&#39;gb2312&#39;] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
$re[&#39;gbk&#39;]  = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
$re[&#39;big5&#39;]  = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
preg_match_all($re[$charset], $str, $match);
$slice = join("",array_slice($match[0], $start, $length));
return $slice.$suffix;
}

Empfohlenes Tutorial: PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonPHP schneidet chinesische Zeichen ohne verstümmelte Zeichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn