ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルでの中国語の文字化けのインターセプトの解決策

PHP_PHP チュートリアルでの中国語の文字化けのインターセプトの解決策

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-07-13 10:56:461008ブラウズ

ASCii コードが 0xa0 より大きい場合、それは半分の漢字です。substr()、mb_substr()、ord() を理解してください。 現在一般的に使用されているエンコード形式は、UTF8、GBK、GBK2312、および BIG5 です。 GBK は GBK2312 のアップグレードです。現在、私が開発中に遭遇するのは基本的に UTF8 であり、フォーラム BBS では GBK が一般的に使用されています。今日は自分で UTF8 を書きましたが、テストでは問題なく動作しました。結局のところ、インターネットからコピーしたものを使用することもできますが、時間があれば自分で書いて、得たものだけを自分のものにするのが最善です。 。

一番簡単なのは使うことです

例1

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

echo substr("Hello world!",6);
?>出力:

世界!

例 2
echo substr("Hello world!",6,5);
?>

英語では問題ありませんが、中国語では問題があります。以下では mb_substr 関数を使用して対処します。

/**
*——————————————————————————————————————–
*PHP には、使用できる mbstring 拡張ライブラリがあります (友人が PHP の面接時にこの質問をされました)。 *
ほとんどのサーバーは php_mbstring.dll を開かないので、開く必要があります
* php.ini 内の php_mbstring.dll を開く権限がない場合は、ISP に問い合わせる必要があります。
*mb_string の方が効率的であるため、最初に mb_string が使用できるかどうかを確認します:
*——————————————————————————————————————–
*/

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

if(function_exists(‘mb_string’))
{
mb_substr($string,$start,$length,$encoding);
//その他のコードはこちら
}
else mysubstr($string,$start,$length);// 独自の関数を呼び出します
?>

まず独自の関数を定義します

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

/**
*————————————-
*最初に独自の関数を定義します:
*————————————-
*/
関数 mysubstr($string, $start, $length)
{
if(strlen($string)>$length)
{
$str=”;
$len=$start+$length;
for($i=$start;$i<$len;$i++)
{
if(ord(substr($string,$i,1))>0xa0)
{
$str.=substr($string,$i,2);
$i++;
}
else{ $str.=substr($string,$i,1);}
}
$str を返します。'…';
}
else{ return $string;}
}

この方法を使用する場合、 タグのペアの文字セットは GBK、GB2312 などの中国語エンコーディングにのみ設定できることに注意してください。

以下は私がよく使う中国語と英語の文字インターセプト機能です

中国語の文字列インターセプト関数のカスタマイズは、基本的に mb_substr をモデルにした関数を作成し、それを直接呼び出すことです。以下にあるコードは実際には非常に簡単です。

コードは次のとおりですコードをコピー
関数 substr_cn($string_input,$start,$length)
{
/* 関数:
* このアルゴリズムは中国語の文字列を傍受するために使用されます
* この関数は 1 つの完全な文字の単位でインターセプトします。つまり、1 つの英語文字と 1 つの中国語文字は両方とも 1 単位の長さを表します
* パラメータ:
* パラメータ $string はインターセプトされる文字列です。
* パラメータ $start はインターセプトの開始位置です。
* パラメータ $length はインターセプトする文字数です (漢字または英語 1 文字を 1 文字として数えます)
* 戻り値:
* インターセプトされた結果文字列を返します
* */
$str_input=$string_input
$len=$長さ
$return_str=""
//空の文字列を定義します
for ($i=0;$i<2*$len+2;$i++)
$return_str=$return_str." "; $start_index=0; //開始バイトオフセットを計算します
($i=0;$i<$start;$i++)
{
if(ord($ str_input {$ start_index}&gt; = 161)))                                                                    $start_index+=2; }
その他                                                                    $start_index+=1;                                                                                      }
$chr_index=$start_index
//インターセプト
($i=0;$i<$len;$i++) の場合
{
$asc=ord($str_input{$chr_index}); if ($asc>=161)
                                                                   $return_str{$i}=chr($asc); $return_str{$i+1}=chr(ord($str_input{$chr_index+1})); $len+=1 //終了条件に 1 を追加します
; $i++; $chr_index+=2; 続く; }
それ以外
                                                                   $return_str{$i}=chr($asc); $chr_index+=1; }
}
トリムを返す($return_str)
}//substr_cn の終わり
?>






www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632151.html技術記事 ASCii コードが 0xa0 より大きい場合、それは半分の漢字です。substr()、mb_substr()、ord() を理解してください。現在一般的に使用されているエンコード形式は、UTF8、GBK、GBK2312、および BIG5 です。 GBK は GBK2312 のアップグレードです。今私は開発中です...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。