php 編碼轉換 亂碼解決
阿新 • • 發佈:2019-01-08
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 是要轉換的變數的引用。 引數可以接受 String、Array 和 Object 的型別。 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, 或者在失敗時返回 FALSE。 In 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';
}
}