ホームページ  >  記事  >  バックエンド開発  >  PHP 中国語 string_PHP で文字化けがインターセプトされる問題の解決方法_PHP チュートリアル

PHP 中国語 string_PHP で文字化けがインターセプトされる問題の解決方法_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:57:051044ブラウズ

中国語のインターセプトと文字化けの問題は、通常、中国語の文字が混在することが原因で発生します。英語をインターセプトする場合は問題ありませんが、中国語は文字列のエンコーディングが UTF-8 であるため、中国語の文字が 1 つ必要になります。最大 3 バイト、文字列エンコードは GB2312 で、1 つの漢字が 2 バイトを占めます。まずは例を見てみましょう。

文字列エンコードは GB2312 で、1 つの中国語文字は 2 バイトを占めます:

文字列は UTF-8 としてエンコードされ、1 つの中国語文字は 3 バイトを占めます:
コードは次のとおりです コードをコピー

public static function chinesesubstr($str, $start, $len) { // $str は文字列を指します、$start は文字列の開始位置を指します、$len は文字列の長さを指します
$strlen = $start + $len; // 文字列の全長、つまり文字列の開始位置から文字列の全長までを格納するには $strlen を使用します
for($i = $start; $i < $strlen;) {
If (ord ( substr ( $str, $i, 1 ) ) > 0xa0) { // 文字列の最初のバイトの ASCII 序数値が 0xa0 より大きい場合、それは漢字
を意味します $ tmpstr。= substr($ str、$ i、2); ​​​​​​​​ } 他{
$tmpstr .= substr ( $str, $i, 1 ); // 漢字でない場合は、1 文字ずつ取り出して変数 $tmpstr
に代入します。 $i++;
}
}
return $tmpstr // 文字列を返します
}

コードは次のとおりです
コードをコピー
public static function chinesesubstr($str, $start, $len) { // $str は文字列を指します、$start は文字列の開始位置を指します、$len は文字列の長さを指します

$strlen = $start + $len; // 文字列の全長、つまり文字列の開始位置から文字列の全長までを格納するには $strlen を使用します
for($i = $start; $i < $strlen;) {
If (ord ( substr ( $str, $i, 1 ) ) > 0xa0) { // 文字列の最初のバイトの ASCII 序数値が 0xa0 より大きい場合、それは漢字
を意味します $ tmpstr。= substr($ str、$ i、3); ​​​​​​​​ } 他{
$tmpstr .= substr ( $str, $i, 1 ); // 漢字でない場合は、1 文字ずつ取り出して変数 $tmpstr
に代入します。 $i++;
}
}
return $tmpstr // 文字列を返します
}



この問題は上記で解決されましたが、比較的厄介なエンコーディングの問題に注意する必要があります。これは、どのようなエンコーディングが使用されても機能する解決策です。

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

/**
※漢字インターセプト機能はUtf-8とgb2312でサポートされました
*cut_str(文字列、カット長、開始長、エンコーディング);
※エンコードはデフォルトでutf-8です
* デフォルトの開始長は 0 です
​*/
関数cut_str($string, $sublen, $start = 0, $code = 'UTF-8')
{
If($code == 'UTF-8')
{
$pa = "/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]| xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/";
preg_match_all($pa, $string, $t_string);
If(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen))."…";
return join('', array_slice($t_string[0], $start, $sublen));
}
それ以外
{
$start = $start*2;
$sublen = $sublen*2;
$strlen = strlen($string);
$tmpstr = '';
for($i=0; $i {
If($i>=$start && $i {
If(ord(substr($string, $i, 1))>129)
{
$tmpstr.= substr($string, $i, 2);
}
その他
{
$tmpstr.= substr($string, $i, 1);
}
}
If(ord(substr($string, $i, 1))>129) $i++;
}
If(strlen($tmpstr) 戻り $tmpstr;
}
}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632122.html技術記事中国語の文字化けの問題は、通常、中国語の文字が混在していることが原因で発生します。英語をインターセプトする場合は問題ありませんが、中国語は問題が発生します。主な理由は、文字列が UTF-8 としてエンコードされており、中国語であることです。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。