PHPエンコード変換機能(自動文字セット変換は配列変換に対応)

WBOY
リリース: 2016-07-25 09:10:20
オリジナル
1179 人が閲覧しました
  1. // 自動変換文字セットは配列変換をサポートします
  2. function auto_charset($fContents, $from='gbk', $to='utf-8') {
  3. $from = strtoupper($ from) == 'UTF8' ? : $from;
  4. $to = strtoupper($to) == 'UTF8' ? : $to;
  5. if (strtoupper($from) = == strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents))) {
  6. //エンコーディングが同じか非文字列スカラーの場合は変換なし
  7. return $ fContents ;
  8. }
  9. if (is_string($fContents)) {
  10. if (function_exists('mb_convert_encoding')) {
  11. return mb_convert_encoding($fContents, $to, $from);
  12. } elseif (function_exists('iconv')) {
  13. return iconv($from, $to, $fContents);
  14. } else {
  15. return $fContents;
  16. }
  17. } elseif (is_array($fContents)) {
  18. foreach ($fContents as $key => $val ) {
  19. $_key = auto_charset($key, $from, $to);
  20. $fContents[$_key] = auto_charset($val, $from, $to);
  21. if ($key != $_key)
  22. unset ( $fContents[$key]);
  23. }
  24. return $fContents;
  25. }
  26. else {
  27. return $fContents;
  28. }
  29. }
コードをコピー

現時点では、iconv を直接次の目的で使用することを考えるかもしれません。しかし、iconv 関数が提供する必要がある 2 つのパラメータは入力エンコーディングと出力エンコーディングであり、受信した文字列がどのエンコーディングであるかはわかりません。この時点で受信した文字のエンコーディングを取得できれば素晴らしいのですが。時間。 この問題については、次の 2 つのオプションが参考になります。

オプション 1 クライアントにデータを送信してもらいたい場合は、送信されたエンコーディングを指定する必要があります。この場合、エンコーディングを指定するための追加の変数を指定する必要があります。 $string = $_GET['charset'] === 'gbk' ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str']; この状況では、合意がない場合、またはクライアントを制御できない場合、このソリューションの使用はあまり適切ではないようです。

オプション 2 受信データのエンコーディングはサーバーによって直接検出されます。 もちろん、この解決策は最も理想的です。問題は、文字のエンコーディングをどのように検出するかということです。この状況に対して、PHP では、mb_string 拡張機能の mb_check_encoding が必要な機能を提供します。 $str = mb_check_encoding($_GET['str'],'gbk') iconv('gbk','utf-8',$_GET['str']) : $_GET['str']; ただし、これには mb_string 拡張機能を有効にする必要があります。場合によっては、この拡張機能が実稼働サーバーで有効になっていない場合があります。この場合、次の関数を使用してエンコーディングを決定する必要があります。

  1. function isGb2312($string) {
  2. for($i=0; $i 127) {
  3. if( ($v >= 228) && ($v < = 233) ) )
  4. {
  5. if( ($i+2) >= (strlen($string) - 1)) return true;
  6. $v1 = ord( $string[$i+1] );
  7. $v2 = ord ( $string[$i+2] );
  8. if( ($v1 >= 128) && ($v1 < =191) && ($v2 >=128) && ($v2 < = 191) )
  9. return false;
  10. else
  11. return true;
  12. }
  13. }
  14. }
  15. return true;
  16. }
  17. function isUtf8($string) {
  18. return preg_match('%^(?:
  19. [x09x0Ax0Dx20-x7E] # ASCII
  20. | [xC2-xDF][x80-xBF] # 非オーバーロング 2 バイト
  21. | xE0[xA0-xBF][x80-xBF] # オーバーロングを除く
  22. | [xE1-xECxEExEF][x80-xBF]{2} # ストレート3-byte
  23. | xED[x80-x9F][x80-xBF] # サロゲートを除く
  24. | xBF]{3} # プレーン 4-15
  25. | ここで、エンコーディングを検出して変換することができます指定されたエンコーディングに変換します。 $str = isGb2312($_GET['str'],'gbk') ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート