1. 程式人生 > >php 編碼轉換 亂碼解決

php 編碼轉換 亂碼解決

iconv詳解:
iconv — 字串按要求的字元編碼轉換
iconv有bug ,碰到一些生僻字就會無法轉換,當然了配置第二個引數時,可以稍微彌補一下預設缺陷,不至於無法轉換是截斷,用法如下
iconv(“UTF-8″,”GB2312//IGNORE”,$data) ;
這樣碰到生僻字轉換失敗時,它就會忽略失敗,繼續轉換下面的內容。

iconv
string iconv ( string $in_charset , string $out_charset , string $str )

第一個引數:內容原的編碼

第二個引數:目標編碼

第三個引數:要轉的字串

函式返回字串

<?
php $instr = ‘測試’; // GBK轉UTF-8 $outstr = iconv(‘GBK’,'UTF-8′,$instr); ?>

返回值
返回轉換後的字串, 或者在失敗時返回 FALSE。

mb_convert_encoding詳解:
為了確保轉換的成功率,我們可以用另一個轉換函式
mb_convert_encoding,這個函式效率不是很高,另外這個函式還可以省略第三個引數,自動識別內容編碼,不過最好不要用,影響效率,還需要注意的時,mb_convert_encoding和iconv引數順序不一樣,一定要注意。

附兩個函式簡單的用法:

mb_convert_encoding
string mb_convert_encoding ( string $str
, string $to_encoding [, mixed $from_encoding ] ) 第一個引數:要處理的字串 第二個引數:目標編碼 第三個引數:內容原編碼,它可以是一個 array 也可以是逗號分隔的列舉列表 <?php $instr = '測試'; // GBK轉UTF-8 $outstr = mb_convert_encoding($instr,'UTF-8','GBK',); $str = mb_convert_encoding($instr, "UCS-2LE", "JIS, eucjp-win, sjis-win"); ?>

個人建議碰到轉碼問題時採用mb_convert_encoding比較保險。

mb_convert_variables

mb_convert_variables — 轉換一個或多個變數的字元編碼

mb_convert_variables ( $to_encoding , $from_encoding , &$vars [, mixed &$... ] )

將變數 vars 的編碼從 from_encoding 轉換成編碼 to_encoding。

mb_convert_variables() 會拼接變數陣列或物件中的字串來檢測編碼,因為短字串的檢測往往會失敗。因此,不能在一個數組或物件中混合使用編碼。
to_encoding  將 string 轉換成這個編碼。

from_encoding 可以指定為一個 array 或者逗號分隔的 string,它將嘗試根據 from-coding 來檢測編碼。 當省略了 from_encoding,將使用 detect_order。
vars 是要轉換的變數的引用。 引數可以接受 StringArrayObject 的型別。 mb_convert_variables() 假設所有的引數都具有同樣的編碼。
額外的 vars。
返回值 :
成功時返回轉換前的字元編碼,失敗時返回 FALSE
例項:
<?php
/* 轉換變數 $post1、$post2 編碼為內部(internal)編碼 */
$interenc = mb_internal_encoding();
$inputenc = mb_convert_variables($interenc, "ASCII,UTF-8,SJIS-win", $post1, $post2);
?>

mb_internal_encoding
mb_internal_encoding — 設定/獲取內部字元編碼

mixed mb_internal_encoding ([ string $encoding = mb_internal_encoding() ] )
引數 :
encoding 字元編碼名稱使用於 HTTP 輸入字元編碼轉換、HTTP 輸出字元編碼轉換、mbstring 模組系列函式字元編碼轉換的預設編碼。 
返回值 :
如果設定了 encoding,則成功時返回 TRUE, 或者在失敗時返回 FALSEIn this case, the character encoding for multibyte regex is NOT changed. 如果省略了 encoding,則返回當前的字元編碼名稱。
<?php
/* 設定內部字元編碼為 UTF-8 */
mb_internal_encoding("UTF-8");

/* 顯示當前的內部字元編碼*/
echo mb_internal_encoding();
?>

mb_detect_encoding詳解:

mb_detect_encoding — 檢測字元的編碼

string mb_detect_encoding ( string $str [, mixed $encoding_list = mb_detect_order() [, bool $strict = false ]] )

檢測字串 str 的編碼。

引數 
str    待檢查的字串。
encoding_list   是一個字元編碼列表。 編碼順序可以由陣列或者逗號分隔的列表字串指定。
如果省略了 encoding_list 將會使用 detect_order。
strict    strict 指定了是否嚴格地檢測編碼。 預設是 FALSE。
返回值
檢測到的字元編碼,或者無法檢測指定字串的編碼時返回 FALSE

字串編碼未知的情況下對字串進行編碼:
1、無論字串編碼是什麼,均轉換為gbk

function getSafeStr($str){
    $s1 = iconv('utf-8','gbk//IGNORE',$str);
    $s0 = iconv('gbk','utf-8//IGNORE',$s1);
    if($s0 == $str){
        return $s1;
    }else{
        return $str;
    }
}

2、無論字串編碼是什麼,均轉換為utf-8

function getSafeStr($str){
    $s1 = iconv('gbk','utf-8//IGNORE',$str);
    $s0 = iconv('utf-8','gbk//IGNORE',$s1);
    if($s0 == $str){
        return $s1;
    }else{
        return $str;
    }
}

獲取字串編碼方法:

function getcode($str)
{
    $s1 = iconv('utf-8','gbk//IGNORE',$str);
    $s0 = iconv('gbk','utf-8//IGNORE',$s1);
    if($s0 == $str){
        return 'utf-8';
    }else{
        return 'gbk';
    }
}