ホームページ >php教程 >php手册 >PHP が UTF-8 文字列を正しく解析するスキル application_php の基礎

PHP が UTF-8 文字列を正しく解析するスキル application_php の基礎

WBOY
WBOYオリジナル
2016-05-16 09:00:252069ブラウズ

「PHPとMYSQLを学ぶ - 文字エンコード(前編)」では、UnicodeとUTF-8の変換関係を紹介し、UTF-8のエンコード規則をまとめ、このエンコード規則に基づいてUTF-8エンコード解析プログラムを作成します。と書かれています。以下は PHP の実装です:

コードをコピー コードは次のとおりです:

/*
プログラム関数 $str は、中国語と英語が混在した UTF-8 エンコード文字列です。
この文字列は、UTF-8 エンコード規則に従って正しくデコードされ、表示されます。 。
*/


$str = '今日はとても幸せなので、コーラのチキンウィングを食べに KFC に行くことにしました!!!';

/*
$str はインターセプトされます。文字列
$len はインターセプトされる文字数です。
*/
function utf8sub($str,$len) {
if($len return '';
}

$offset = 0; // 上位バイトをインターセプトするときのオフセット
$chars = 0; // インターセプトされた文字数
$res = ''; // インターセプトした結果の文字列を保存します

while($chars // 文字列の最初のバイトを最初に取得します
// 10 進数に変換します
> // 次にバイナリに変換します
$high = ord(substr($str,$offset,1));

// echo '$high='. $high .'
' ;

if($high == null ){ // 上位ビットが null の場合は最後までフェッチされたことを証明し、直接ブレークします
break;
}
if(($high> >2) === 0x3F){ // 上位ビットを右に 2 ビットシフトし、バイナリ 111111 と比較します。同じ場合は 6 バイトを取得します。
// インターセプト2 バイト
$count = 6;
}else if(($high>>3) === 0x1F){ // 上位ビットを右に 2 ビットシフトし、バイナリ 11111 と比較します。それらは同じです、5 バイトを取ります
// 3 バイトをインターセプト$count = 5;
}else if(($high>>4) === 0xF){ // 上位ビットをシフトします2 ビット右に移動し、バイナリ 1111 と比較します。同じであれば、4 バイトを取得します

//4 バイトをインターセプトします
$count = 4;
}else if(($ high>>5) === 0x7){ // 上位ビットを 2 ビット右にシフトし、バイナリ 111 を比較し、同じ場合は 3 バイトを取る

// 5 バイトをインターセプト
$count = 3;
}else if(($high>>6) === 0x3) { // 上位ビットを右に 2 ビットシフトし、バイナリ 11 と比較し、同じであれば、 take 2 bytes
// 6 バイトをインターセプト
$count = 2;
}else if(($high >>7) === 0x0){ // 上位ビットを右に 2 シフトしますビット、バイナリ 0 と比較し、同じ場合は 1 バイトを取得します
$count = 1;
}
// echo ' $count='.$count.'
' ;

$res .= substr($str,$offset,$count); // 文字を取り出して $res と連結 string
$chars = 1; // 文字数インターセプトは 1
$offset = $count; // インターセプトされた上位オフセットは $count バイトだけ後方に移動します
}
return $res;
}

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