ホームページ  >  記事  >  バックエンド開発  >  PHP で mb_detect_encoding 関数を使用する方法

PHP で mb_detect_encoding 関数を使用する方法

不言
不言オリジナル
2018-06-13 15:03:022801ブラウズ

この記事では主に、PHP の mb_detect_encoding 関数の使い方について、文字列エンコーディングの変換と判定、未定義関数 mb_detect_encoding() の呼び出しエラーの解決方法などを詳しく紹介します。必要な方は参考にしてください。

php mb_detect_encoding() 関数を使用して、文字列のエンコーディングを決定できます。

php の mb_detect_encoding 関数をエンコード識別に使用する場合、GB2312 と UTF-8、または UTF-8 と GBK など、エンコードが正しくない問題に遭遇した人は多いです (主にここ cp936 の判断について) , ネット上ではmb_detect_encodingは文字が短いため誤判定してしまうと言われています。

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

$encode = mb_detect_encoding($keytitle, array("ASCII","UTF-8","GB2312","GBK","BIG5"));
if($encode == "UTF-8"){
  $keytitle = iconv("UTF-8","GBK",$keytitle);
}

このコードの機能は、文字列のエンコードが UTF であるかどうかを検出することです。 -8. その場合は、GBK に変換します。
ただし、$keytitle = “оƬ”; の場合。検出結果は UTF-8 です。このバグは実際にはバグではありません。プログラムを作成する際には、文字列が短い場合、検出結果が偏る可能性があります。
解決策、コードは次のとおりです。

$encode = mb_detect_encoding($keytitle, array("ASCII","GB2312","GBK","UTF-8");

3 つのパラメータは、検出する入力変数、検出順序です。エンコード方式 (一度 true になると、以下は自動的に無視されます) の場合、厳密モードはエンコード検出の順序を調整し、最大の可能性を最初に配置するため、誤った変換の可能性が低くなります。
通常、gb2312 を最初にソートする必要があります。GBK と UTF-8 がある場合は、よく使用されるものを最初にソートする必要があります。

PHP 文字列エンコーディングの変換と判定

GBK と UTF-8 エンコーディング間の変換は非常に厄介なもので、たとえば PHP の json_encode 自体が動作しません。すべて GBK 形式のエンコードをサポートします。エンコード変換をサポートできるライブラリ関数は 2 つあり、通常、使用すると非常に楽しい iconv 関数が思い浮かびます。 /文字列を GBK エンコードから UTF-8 エンコードに変換します

ただし、iconv はエンコードが事前にわかっている状況のみを解決できます。文字列のエンコードが不明な場合は、最初にそのエンコードを検出する必要があります。この時に使用するのは mb_string 拡張ライブラリ:


mb_detect_encoding('test string');

ただし、mb_detect_encoding には欠陥があり、誤った判定が発生することがよくあります。おそらくこれは解決できるでしょう:

// 使用 iconv 转换并判断是否等值,效率不高
function is_utf8 ($str) {
  if ($str === iconv('UTF-8', 'UTF-8//IGNORE', $str)) {
    return 'UTF-8';
  }
}
// 多种编码的情况
function detect_encoding ($str) {
  foreach (array('GBK', 'UTF-8') as $v) {
    if ($str === iconv($v, $v . '//IGNORE', $str)) {
      return $v;
    }
  }
}

上記の方法で文字列エンコード情報を取得した後、iconv または mb_convert_encoding を使用してエンコードを変換できます。

未定義関数 mb_detect_encoding() の呼び出しエラー解決策

Windows システムの場合:
1. 未定義関数の呼び出し: C:\Program Files\AppServ\www\...\xxx.php の 82 行目の iconv()
php には文字エンコード変換用の iconv() 関数があります
php.ini ファイル内また、この関数を通常に使用できるようにするための extension=php_iconv.dll
のようなステートメントです。
php.ini ファイルの extension=php_iconv.dll の前にセミコロンがある場合は、それを意味します。存在する場合はコメントアウトされています。セミコロンを削除してサーバーを再起動する必要があります。
問題を解決するには、プログラムを再実行してください。

2. 致命的なエラー: C の未定義関数 mb_detect_encoding() の呼び出し。 \Program Files\AppServ\www\.. .\xxx.php 行 1355

1. PHP 拡張機能のディレクトリを見つけます (PHP 拡張機能のディレクトリのパスは C:\Program Files\AppServ\php\extensions です)。

拡張ディレクトリ ファイルの下で php_mbstring.dll を見つけます。
2. php_mbstring.dll ファイルを php.ini ファイルが存在するディレクトリ (php.ini ファイルが存在するディレクトリ: C:\) にコピーします。 WINDOWS)
3. メモ帳で php を開き、ショートカット キー Ctrl F を使用して extension=php_mbstring.dll を検索します。php.ini ファイルに extension=php_mbstring.dll が存在する場合は、それを削除します。行の拡張子の前にセミコロンを追加します。
存在しない場合は、他の extension=... の次の行に extension=php_mbstring.dll を追加します。
最後に、php.ini を忘れずに保存してください。ファイル
5. Apache サーバーを再起動します

php_mbstring が実際にはコピーされていないことがわかりました。

Linux システムの場合:

次の問題が発生した場合:

PHP 1. {main} () /home/xu/web/whois/ab.cn.php: 0

PHP 2.base_func->is_exist() /home/xu/web/whois/ab.cn.php:21

PHP 3.strftime() /home/xu/web/whois/whois. mysql.php:46

ab.cnis が存在しますdf250b2156c434f3390392d09b1c9563PHP 致命的なエラー: /home/xu /web/whois/whois.main.php の 98
行目で未定義関数 mb_detect_encoding() を呼び出しますインターネットでさまざまな情報を検索したところ、php プラグイン php-mbstring がインストールされていないことがわかりました (学生によっては php.ini でこのプラグインを有効にしていない可能性があります)。メモのためにこの段落を書きます。

まず、yum または apt を使用して mbstring.so をインストールし、次のコマンドを使用します: yum install php-mbstring または apt-get install php-mbstring (ubuntu ユーザーは、インストールする前に apt-cache search mbstring を使用して検索するのが最適です)ソフトウェア名が間違っている可能性があります)

次に、php.ini を変更します。vim /etc/php.ini を実行し、extension="/usr/lib/php/modules/mbstring.so" の内容を追加します。次のパスは、mbstring に従って格納される場合があります。 .so ディレクトリに対応する変更を加えるだけです。通常、変更する必要はありません。

上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

PHP mkdir() に書き込み権限がない問題を解決する方法

phpinfo システムビューパラメータ関数の実装方法

##laravel 5.1 での php 職人移行の使用について

以上がPHP で mb_detect_encoding 関数を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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