ホームページ  >  記事  >  バックエンド開発  >  文字化けのないPHP中国語文字列の切り詰めソリューション

文字化けのないPHP中国語文字列の切り詰めソリューション

高洛峰
高洛峰オリジナル
2016-12-20 15:46:121290ブラウズ

比較的使いやすい文字列インターセプト関数:

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;
}

使用例:

$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);

結果は次のようになります:

28
29
I am a string ofComparis
I am a比較の文字列
英語なしの中国語
yingwen 付きの中国語

この関数は、たとえば、比較的長いファイル名を切り詰めるのに使用されますが、途中に... を追加することができます。次のようになります:

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;
  }
}

さらに、インターネット上で非常に簡単な中国語の切り捨てソリューションを見つけました。試してみたところ、うまくいきました:

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

原理の説明:

chr(0 ) は null ではありません
07null は何も意味せず、chr(0) の値は 0 です。 16進数で表すと0x00、2進数で表すと00000000
08 chr(0)では何も表示されませんが、文字です。
09 中国語の文字が切り捨てられると、エンコード規則に従って、常にその後ろにある他の文字を中国語の文字として引き込まなければなりません。これが文字化けの原因です。 0x81~0xffと0x00の値の組み合わせは常に「空」として表示されます
10この機能により、substr結果の後にchr(0)を追加することで文字化けを防ぐことができます

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

20120705更新:

上記の方法は良いのですが、それでも時々文字化けが発生し、原因はまだわかりません。ただし、UTF8 文字テキストに対して試行およびテストされている次の方法を使用できます。
注: この方法では、中国語の文字は 1 単位の長さとして計算され、1 つの英語文字は 1 単位の長さとして計算されるため、切り捨てるときは長さの設定に注意する必要があります。
長さの計算方法:

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;

文字列切り捨て関数:

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;

使用方法は前に紹介したものと同じです。たとえば、formatName は次のように実装できます (これには少し最適化されています)。中国語の文字の長さ):

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;
 }
}

以上がこの記事の全内容です。皆様の学習に役立つことを願っています。また、皆様も PHP 中国語 Web サイトをサポートしていただければ幸いです。

コード化けのない PHP 中国語文字列の切り詰めに関するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。