ホームページ >バックエンド開発 >PHPチュートリアル >PHPのsubstr文字化け問題を解決する方法

PHPのsubstr文字化け問題を解決する方法

小云云
小云云オリジナル
2017-11-11 11:20:393699ブラウズ

php substr は、php 言語に基づいて開発された、文字列の一部を返す関数です。 php substrを使用すると文字化けが発生することがありますが、どうすれば解決できますか?

string substr ( string $string , int $start [, int $length ] )

string の開始位置から始まる長さの文字列を返します

substr 関数は、GB2312 でエンコードされた場合は 2 バイト、utf-8 でエンコードされた場合は 3 バイトで文字をインターセプトします。指定された長さの文字列をインターセプトするときに切り捨てられると、返された結果が表示されるときに文字化けします。

確認後、解決策は 2 つのカテゴリにまとめることができます:

1. 代わりに mb_substr() 関数を使用します

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

substr() 関数と似ていますが、カウントは文字数に基づいて行われます。文字安全性

mb_substr を使用する () 関数は文字化けがないことを保証できますが、長さの統計がバイト数ではなく文字数の統計になるという欠点があります。表示に使用した場合、同じ長さの中国語の結果と英語の結果では、表示長に大きな差が生じます。

2. substr 関数を強化するための自作関数

これは、substr が漢字に遭遇する問題をより良く解決できる関数です。中国語の文字は 2 つの長さ単位で計算されるため、中国語と英語が混在する環境での文字列インターセプト結果の最終的な表示長は、表示上で文字化けが発生しないように破棄されます。中国語の文字に一般的に使用される UTF と互換性があります。-8 エンコードと GB2312 エンコードは優れた汎用性を持っています。

ソースコードを見る

  function getstr($string, $length, $encoding  = 'utf-8') {    
 $string = trim($string);    
 if($length && strlen($string) > $length) {    
  //截断字符    
  $wordscut = '';    
  if(strtolower($encoding) == 'utf-8') {    
  //utf8编码    
   $n = 0;    
  $tn = 0;    
 $noc = 0;    
 while ($n < strlen($string)) {    
  $t = ord($string[$n]);    
 if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {    
 $tn = 1;    
 $n++;    
  $noc++;    
 } elseif(194 <= $t && $t <= 223) {    
 $tn = 2;    
 $n += 2;    
} elseif(224 <= $t && $t < 239) {    
  $tn = 3;    
  $n += 3;    
  $noc += 2;    
 } elseif(240 <= $t && $t <= 247) {    
 $tn = 4;    
 $n += 4;    
 $noc += 2;    
 } elseif(248 <= $t && $t <= 251) {    
  $tn = 5;    
$n += 5;    
   $noc += 2;    
 } elseif($t == 252 || $t == 253) {    
 $tn = 6;    
   $n += 6;    
   $noc += 2;    
  } else {    
 $n++;    
}    
 if ($noc >= $length) {    
break;    
 }    
}    
 if ($noc > $length) {    
$n -= $tn;    
  }    
 $wordscut = substr($string, 0, $n);    
 } else {    
 for($i = 0; $i < $length - 1; $i++) {    
  if(ord($string[$i]) > 127) {    
$wordscut .= $string[$i].$string[$i + 1];    
$i++;    
 } else {    
   $wordscut .= $string[$i];    
  }    
 }    
  }    
$string = $wordscut;    
 }    
return trim($string);    
 }    
 // 示例    
 echo getstr("0一二三四五六七",1).&#39;<br />&#39;;  // 0    
 echo getstr("0一二三四五六七",2).&#39;<br />&#39;;  // 0    
echo getstr("0一二三四五六七",3).&#39;<br />&#39;;  // 0一    
 echo getstr("0一二三四五六七",4).&#39;<br />&#39;;  // 0一    
 echo getstr("0一二三四五六七",5).&#39;<br />&#39;;  // 0一二    
 echo getstr("0一a二b三四五六七",1).&#39;<br />&#39;;    // 0    
  echo getstr("0一a二b三四五六七",2).&#39;<br />&#39;;    // 0    
 echo getstr("0一a二b三四五六七",3).&#39;<br />&#39;;    // 0一    
 echo getstr("0一a二b三四五六七",4).&#39;<br />&#39;;    // 0一a    
  echo getstr("0一a二b三四五六七",5).&#39;<br />&#39;;    // 0一a

この関数は、UCHome 1.5 の getstr() 関数から変更されています。

上記は、php substr の文字化け問題を解決する方法に関する解決策です。php substr 関数に関する一連の記事も共有しています。必要な場合は、PHP の中国語 Web サイトを参照してください。

関連する推奨事項:

PHP substr() 関数に関するいくつかのプログラム

php substr() 関数の処理中国語の詳細な説明

php substr() 関数の文字列インターセプトの使用例の説明


以上がPHPのsubstr文字化け問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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