ホームページ >バックエンド開発 >PHPチュートリアル >PHPが文字列をインターセプトしたときに中国語が文字化けする問題の解決策

PHPが文字列をインターセプトしたときに中国語が文字化けする問題の解決策

黄舟
黄舟オリジナル
2017-11-15 09:46:132959ブラウズ

前回の記事では、phpインターセプトstringの実装と、phpを使用した中国語文字列のインターセプトについて説明しましたが、中国語文字列をインターセプトすると文字化けがよく起こるので、今日はその方法を紹介します。 PHP で文字列をインターセプトするときに発生する中国語の文字化けの問題を解決します。

PHP は文字列をインターセプトするために substr を使用しており、中国語の文字化けの問題が発生します。mb_substr を使用してください。例:

mb_substr('截取中文乱码问题测试',0,5, 'utf-8');

構文:

string substr (string string, int start [, int length])
$rest = substr ("abcdef", 1); // returns "bcdef"
$rest = substr ("abcdef", 1, 3); // returns "bcd"

start が負の数の場合、返される文字列は文字列の末尾の開始文字から始まります。 。


$rest = substr ("abcdef", -1); // returns "f"
$rest = substr ("abcdef", -2); // returns "ef"
$rest = substr ("abcdef", -3, 1); // returns "d"

パラメーターの長さが指定され、それが正の数値である場合、返される文字列は先頭からの長さの文字になります。


パラメータの長さが指定され、それが負の数値である場合、返される文字列は文字列の末尾の長さ番目の文字で終了します。


$rest = substr ("abcdef", 1, -1); // returns "bcde"

英語には問題ありません。私たちは中国語をテストしました


$rest = substr ("中国人", 1, -1); // returns "fdsafsda" 就是乱码了

この中国語の文字化けの状況は、プログラムが正常に実行できない可能性があります。

解決策は主に2つ

まず、mbstring拡張ライブラリのmb_substr()を使ってインターセプトすることで文字化けが発生しないようにします。 関数 mb_substr()/mb_strcut() を使用できます。mb_substr()/mb_strcut() の使用法は、設定するパラメーターが mb_substr()/mb_strcut の最後に 1 つ追加されることを除いて、substr() と似ています。
ただし、ほとんどのサーバーは php_mbstring.dll を開きません。php.ini で php_mbstring.dll を開く必要があります。

echo mb_substr("php中文字符encode",0,4,"utf-8");

最後のエンコードパラメータが指定されていない場合、3バイトが1つの漢字として使用されます。これは、utf-8

文字セットを追加すると、1つの単語が使用されるという特徴です。ユニットによって迎撃されました。 ご利用の際は、PHPファイルのエンコードとWebページ表示時のエンコードにご注意ください。この mb_substr メソッドを使用するには、文字列のエンコードを事前に知っておく必要があります。エンコードがわからない場合は、mbstring ライブラリにも文字列のエンコードをチェックするための mb_check_encoding が用意されていますが、まだ完全ではありません。 。

PHP にはいくつかの

文字列インターセプト 関数が付属しており、その中で、substr と mb_substr がよく使用されます。前者が中国語を処理する場合、GBK は 2 長さ単位、UTF は 3 長さ単位になります。後者がエンコーディングを指定すると、1 つの中国語文字が 1 長さ単位になります。

substr は時々中国語の 1/3 または半分が切り取られ、文字化けして表示されます。比較的、mb_substr の方が使いやすいです。ただし、mb_substr は使いにくい場合があります。たとえば、小さな

写真の簡単な情報を表示したい場合は、5文字以上の漢字があれば、最初の4文字を切り取って「...」を追加するだけで十分です。漢字は処理できますが、英語や数字を短く処理するのは困難です。

2 番目に、インターセプト関数を自分で作成しますが、効率は mbstring 拡張ライブラリを使用するほど高くありません。以下は、UTF-8 でエンコードされた文字列をインターセプトする ecshop の関数です。

function sub_str($str, $length = , $append = true)
{
  $str = trim($str);
  $strlength = strlen($str);
  if ($length == || $length >= $strlength)
  {
    return $str; //截取长度等于或大于等于本字符串的长度,返回字符串本身
  }
  elseif ($length < ) //如果截取长度为负数
  {
    $length = $strlength + $length;//那么截取长度就等于字符串长度减去截取长度
    if ($length < )
    {
      $length = $strlength;//如果截取长度的绝对值大于字符串本身长度,则截取长度取字符串本身的长度
    }
  }
  if (function_exists(&#39;mb_substr&#39;))
  {
    $newstr = mb_substr($str, , $length, EC_CHARSET);
  }
  elseif (function_exists(&#39;iconv_substr&#39;))
  {
    $newstr = iconv_substr($str, , $length, EC_CHARSET);
  }
  else
  {
    //$newstr = trim_right(substr($str, , $length));
    $newstr = substr($str, , $length);
  }
  if ($append && $str != $newstr)
  {
    $newstr .= &#39;...&#39;;
  }
  return $newstr;
}

概要:

この記事では、PHP インターセプト文字列の中国語文字化けの解決策を 2 つの例を使用して紹介します。同じ問題を抱えている友人は簡単に解決できると思います。

関連する推奨事項:

中国語文字列のインターセプトと中国語文字列の文字数の取得の例


phpで文字列をインターセプトする方法の紹介

PHPインターセプト 文字列関数substr()関数の詳しい説明 使用例

以上がPHPが文字列をインターセプトしたときに中国語が文字化けする問題の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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