ホームページ >バックエンド開発 >PHPチュートリアル >PHPのsubstr文字化け問題を解決する方法
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).'<br />'; // 0 echo getstr("0一二三四五六七",2).'<br />'; // 0 echo getstr("0一二三四五六七",3).'<br />'; // 0一 echo getstr("0一二三四五六七",4).'<br />'; // 0一 echo getstr("0一二三四五六七",5).'<br />'; // 0一二 echo getstr("0一a二b三四五六七",1).'<br />'; // 0 echo getstr("0一a二b三四五六七",2).'<br />'; // 0 echo getstr("0一a二b三四五六七",3).'<br />'; // 0一 echo getstr("0一a二b三四五六七",4).'<br />'; // 0一a echo getstr("0一a二b三四五六七",5).'<br />'; // 0一a
この関数は、UCHome 1.5 の getstr() 関数から変更されています。
上記は、php substr の文字化け問題を解決する方法に関する解決策です。php substr 関数に関する一連の記事も共有しています。必要な場合は、PHP の中国語 Web サイトを参照してください。
関連する推奨事項:
php substr() 関数の文字列インターセプトの使用例の説明
以上がPHPのsubstr文字化け問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。