Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Chinesisch-String-Kürzung ohne verstümmelte Lösung

PHP-Chinesisch-String-Kürzung ohne verstümmelte Lösung

高洛峰
高洛峰Original
2016-12-20 15:46:121290Durchsuche

Eine relativ einfach zu verwendende Funktion zum Abfangen von Zeichenfolgen:

function substring($str, $start, $length){ //比较好用字符串截取函数
  $len = $length;
  if($length < 0){
  $str = strrev($str);
  $len = -$length;
  }
  $len= ($len < strlen($str)) ? $len : strlen($str);
  $tmpstr = "";
  for ($i= $start; $i < $len; $i ++)
  {
      if (ord(substr($str, $i, 1)) > 0xa0)
      {
       $tmpstr .= substr($str, $i, 2);
       $i++;
      } else {
       $tmpstr .= substr($str, $i, 1);
      }
  }
  if($length < 0) $tmpstr = strrev($tmpstr);
  return $tmpstr;
}

Anwendungsbeispiel:

$str1 = &#39;我是一串比较长的中文不带英文&#39;;
$str2 = &#39;我是一串比较长的中文带yingwen&#39;;
 
 
$len = strlen($str1);
echo &#39;<br />&#39;.$len; //return 28
 
$len = strlen($str2);
echo &#39;<br />&#39;.$len; //return 29
 
echo &#39;<br />&#39;; 
echo substring($str1, 0, 11); 
echo &#39;<br />&#39;;
echo substring($str2, 0, 11);   
echo &#39;<br />&#39;;
echo substring($str1, 16, 28); 
echo &#39;<br />&#39;;
echo substring($str2, 16, 29);

Das Ergebnis zeigt:

28
29
Ich bin eine Reihe von Vergleichen
Ich bin eine Reihe von Vergleichen
Chinesisch ohne Englisch
Chinesisch Diese Funktion mit yingwen

ist sehr nützlich, um beispielsweise einen relativ langen Dateinamen abzuschneiden, aber wenn Sie ... in der Mitte hinzufügen möchten, können Sie dies tun so:

function formatName($str, $size){
  $len = strlen($str);
  if(strlen($str) > $size) {
    $part1 = substring($str, 0, $size / 2);
    $part2 = substring($str, $len - ($size/2), $len);
    return $part1 . "..." . $part2;
  } else {
    return $str;
  }
}

Außerdem habe ich im Internet eine supereinfache Lösung zum Kürzung von Chinesisch gesehen und sie hat gut funktioniert:

echo substr($str1,0,10 ).chr(0);

Prinzipielle Erklärung:

chr(0) ist nicht null
07null bedeutet nichts , und der Wert von chr(0) ist 0. Hexadezimal ausgedrückt ist es 0x00, binär ausgedrückt ist es 00000000
08 Obwohl chr(0) nichts anzeigt, ist es ein Zeichen.
09 Wenn chinesische Schriftzeichen abgeschnitten werden, müssen sie gemäß den Kodierungsregeln immer andere Schriftzeichen als chinesische Schriftzeichen zur Interpretation mit einbeziehen. Aus diesem Grund erscheinen verstümmelte Schriftzeichen. Die Kombination der Werte 0x81 bis 0xff und 0x00 wird immer als „leer“ angezeigt
10Gemäß dieser Funktion kann das Hinzufügen eines chr(0) nach dem Substr-Ergebnis verstümmelte Zeichen verhindern

---- ------------------------

Update 20120705:

und höher Obwohl die Methode ist gut, man trifft immer noch gelegentlich auf verstümmelte Zeichen und der Grund ist noch nicht untersucht. Sie können jedoch die folgende Methode verwenden, die sich mit UTF8-Zeichentexten bewährt hat.
Hinweis: Bei dieser Methode werden chinesische Zeichen als 1 Längeneinheit berechnet und ein englischer Buchstabe hat 1 Längeneinheit, daher müssen Sie beim Abschneiden auf die Längeneinstellung achten.
Methode zur Längenberechnung:

function strlen_UTF8($str)
{
  $len = strlen($str);
  $n = 0;
  for($i = 0; $i < $len; $i++) {
    $x = substr($str, $i, 1);
    $a = base_convert(ord($x), 10, 2);
    $a = substr(&#39;00000000&#39;.$a, -8);
    if (substr($a, 0, 1) == 0) {
    }elseif (substr($a, 0, 3) == 110) {
      $i += 1;
    }elseif (substr($a, 0, 4) == 1110) {
      $i += 2;
    }
    $n++;
  }
  return $n;
} // End strlen_UTF8;

String-Trunkierungsfunktion:

function subString_UTF8($str, $start, $lenth)
  {
    $len = strlen($str);
    $r = array();
    $n = 0;
    $m = 0;
    for($i = 0; $i < $len; $i++) {
      $x = substr($str, $i, 1);
      $a = base_convert(ord($x), 10, 2);
      $a = substr(&#39;00000000&#39;.$a, -8);
      if ($n < $start){
        if (substr($a, 0, 1) == 0) {
        }elseif (substr($a, 0, 3) == 110) {
          $i += 1;
        }elseif (substr($a, 0, 4) == 1110) {
          $i += 2;
        }
        $n++;
      }else{
        if (substr($a, 0, 1) == 0) {
          $r[ ] = substr($str, $i, 1);
        }elseif (substr($a, 0, 3) == 110) {
          $r[ ] = substr($str, $i, 2);
          $i += 1;
        }elseif (substr($a, 0, 4) == 1110) {
          $r[ ] = substr($str, $i, 3);
          $i += 2;
        }else{
          $r[ ] = &#39;&#39;;
        }
        if (++$m >= $lenth){
          break;
        }
      }
    }
    return join($r);
  } // End subString_UTF8;

Die Verwendungsmethode ist die gleiche wie zuvor eingeführt. FormatName kann beispielsweise wie folgt implementiert werden (dies hat eine kleine Optimierung der Länge chinesischer Zeichen zur Folge):

function formatName($str, $size){
 $len = strlen_UTF8($str);
 $one_len = strlen($str);
 $size = $size * 1.5 * $len / ($one_len);
 if(strlen_UTF8($str) > $size) {
  $part1 = subString_UTF8($str, 0, $size / 2);
  $part2 = subString_UTF8($str, $len - ($size/2), $len);
  return $part1 . "..." . $part2;
 } else {
  return $str;
 }
}

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Lernen aller hilfreich ist. Ich hoffe auch, dass jeder die chinesische PHP-Website unterstützt.

Weitere Artikel zum Thema PHP-Chinesisch-String-Kürzung ohne verstümmelte Codelösungen finden Sie auf der PHP-Chinesisch-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