コードをコピー コードは次のとおりです:
/*
* 関数: 文字化けしないことを除いて、関数は substr と同じです
* パラメーター:
* 戻り値:
*/
function utf8_substr( $str , $start , $length=null ){
// 最初に通常通りインターセプトします。
$strlen = strlen( $str ); * その後、最初と最後の 6 バイトが完全である (不完全ではない) かどうかを判断します */
// パラメーター start が正の数の場合
if ( $start >= 0 ) {
// 約 6 バイト前方にカットします
$next_start = $start + $length; // 初期位置
$next_len = $next_start + 6 // 最初のバイトが完全な文字の最初のバイトではない場合、
$prev_start = $start - 6 >
$prev_segm = substr ( $str , $prev_start , $start - $prev_start );
}
// start は負の数
else{
// 約 6 バイト前方をインターセプト
$next_start = $strlen + $start + $length; //初期位置
$next_len = $next_start + 6 $next_segm = substr( $str , $next_start , $next_len );完全な文字の最初のバイト、その後約 6 バイトをインターセプトします。
$prev_start = $start - 6 : 0; str , $prev_start , $ start - $prev_start );
}
// 最初の 6 バイトが utf8 ルールに準拠しているかどうかを判断します
if ( preg_match( '@^([x80-xBF]{0,5})[xC0- xFD]?@' , $ next_segm , $bytes ) ){
if ( !empty( $bytes[1] ) ){
$bytes = $bytes[1] .= $bytes
} ;
// 判定後の 6 ワード セクションは utf8 ルールに準拠していますか
$ord0 = ord( $res[0] );
if ( 128 <= $ord0 && 191 >= $ord0 ){
// インターセプト後ろから追加して res の前に追加します。 ( $bytes[0] ){
$ bytes = $bytes[0];
}
}
}
$res を返す
コードをコピーします
コードは次のとおりです:
$str = 'dfjdjf test 13f test 65&2 datafdj(1 is mfe&...just'
var_dump( utf8_substr( $str) , 22 , 12 ) ; echo '
' ;
var_dump( $str , 22 , -6 ) '; 9 , 12 ) ; echo '
';
var_dump( $str , 19 , 12 ) '; -6 ) ); echo '
結果の表示:: (文字化けのインターセプトはありません。誰でもテストしてバグを送信できます) string(12) "fsdj による" string( 26) "tofddjによると(1はmfe&…" string(13) "13f try 65&2 Number" string(12) "datadd"
string(20) "sj(1はmfe&…"
http://www.bkjia.com/PHPjc/326195.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/326195.html
技術記事
次のようにコードをコピーします。 /* * 関数: この関数は文字化けしないことを除いて、substr と同じです* パラメーター: * 戻り値: */ function utf8_substr( $str, $start, $length=null){ // まずは普通にカットします ..