php將unicode編碼轉爲utf-8方法

介紹

在前端開發中,爲了讓中文在不一樣的環境下都能很好的顯示,通常是將中文轉化爲unicode格式,即\u4f60,好比:」你好啊」的 unicode編碼爲」\u4f60\u597d\u554a」。php

JS裏將中文轉爲unicode編碼很簡單。html

function convert2Unicode(str) {
	return str.replace(/[\u0080-\uffff]/g,
	function($0) {
		var tmp = $0.charCodeAt(0).toString(16);
		return "\u" + new Array(5 - tmp.length).join('0') + tmp;
	});
}

而且也很簡單,直接alert出來或者innerHTML到dom節點裏均可以。前端

但若是將\u4f60\u597d\u554a」字符傳遞給php,php就不能直接echo或者其餘操做了。直接echo的話仍是原生的字符,不 能自動轉化爲中文。json

 

php將unicode轉爲utf-8方法

在php5.0及以上版本中提供了json_encode, json_decode方法。在使用json_encode變量的時候,若是變量裏含有中文的話,會將中文轉爲unicode格式。因此在想是否能夠經過 json_decode將unicode轉爲中文呢?實際測試發現是能夠的,但對單一的字符串發現有些問題。數組

對於簡單的字符串,發現有時候使用json_decode轉的化,結果直接爲空了。但將字符串替換爲數組而後在轉就能夠了。下面就有了下面封裝的代 碼。dom

function unicode2utf8($str){
        if(!$str) return $str;
        $decode = json_decode($str);
        if($decode) return $decode;
        $str = '["' . $str . '"]';
        $decode = json_decode($str);
        if(count($decode) == 1){
                return $decode[0];
        }
        return $str;
}

使用這個方法能夠很好的將unicode編碼轉爲utf-8編碼。測試

附上js轉爲實體字符和php將實體字符轉爲漢字的方法

js將漢字轉爲實體字符:編碼

function convert2Entity(str) {
	var len = str.length;
	var re = [];
	for (var i = 0; i < len; i++) { 		var code = str.charCodeAt(i); 		if (code > 256) {
			re.push('&#' + code + ';');
		} else {
			re.push(str.charAt(i));
		}
	}
	return re.join('');
}

php將實體字符轉爲utf-8漢字的方法:code

function entity2utf8onechar($unicode_c){
	$unicode_c_val = intval($unicode_c);
	$f=0x80; // 10000000
	$str = "";
	// U-00000000 - U-0000007F:   0xxxxxxx
	if($unicode_c_val <= 0x7F){ 		$str = chr($unicode_c_val); 	} 	//U-00000080 - U-000007FF:  110xxxxx 10xxxxxx 	else if($unicode_c_val >= 0x80 && $unicode_c_val <= 0x7FF){ 		$h=0xC0; // 11000000 		$c1 = $unicode_c_val >> 6 | $h;
		$c2 = ($unicode_c_val & 0x3F) | $f;
		$str = chr($c1).chr($c2);
	}
	//U-00000800 - U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx
	else if($unicode_c_val >= 0x800 && $unicode_c_val <= 0xFFFF){ 		$h=0xE0; // 11100000 		$c1 = $unicode_c_val >> 12 | $h;
		$c2 = (($unicode_c_val & 0xFC0) >> 6) | $f;
		$c3 = ($unicode_c_val & 0x3F) | $f;
		$str=chr($c1).chr($c2).chr($c3);
	}
	//U-00010000 - U-001FFFFF:  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
	else if($unicode_c_val >= 0x10000 && $unicode_c_val <= 0x1FFFFF){ 		$h=0xF0; // 11110000 		$c1 = $unicode_c_val >> 18 | $h;
		$c2 = (($unicode_c_val & 0x3F000) >>12) | $f;
		$c3 = (($unicode_c_val & 0xFC0) >>6) | $f;
		$c4 = ($unicode_c_val & 0x3F) | $f;
		$str = chr($c1).chr($c2).chr($c3).chr($c4);
	}
	//U-00200000 - U-03FFFFFF:  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
	else if($unicode_c_val >= 0x200000 && $unicode_c_val <= 0x3FFFFFF){ 		$h=0xF8; // 11111000 		$c1 = $unicode_c_val >> 24 | $h;
		$c2 = (($unicode_c_val & 0xFC0000)>>18) | $f;
		$c3 = (($unicode_c_val & 0x3F000) >>12) | $f;
		$c4 = (($unicode_c_val & 0xFC0) >>6) | $f;
		$c5 = ($unicode_c_val & 0x3F) | $f;
		$str = chr($c1).chr($c2).chr($c3).chr($c4).chr($c5);
	}
	//U-04000000 - U-7FFFFFFF:  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
	else if($unicode_c_val >= 0x4000000 && $unicode_c_val <= 0x7FFFFFFF){ 		$h=0xFC; // 11111100 		$c1 = $unicode_c_val >> 30 | $h;
		$c2 = (($unicode_c_val & 0x3F000000)>>24) | $f;
		$c3 = (($unicode_c_val & 0xFC0000)>>18) | $f;
		$c4 = (($unicode_c_val & 0x3F000) >>12) | $f;
		$c5 = (($unicode_c_val & 0xFC0) >>6) | $f;
		$c6 = ($unicode_c_val & 0x3F) | $f;
		$str = chr($c1).chr($c2).chr($c3).chr($c4).chr($c5).chr($c6);
	}
	return $str;
}
function entities2utf8($unicode_c){
	$unicode_c = preg_replace("/\&\#([\da-f]{5})\;/es", "entity2utf8onechar('\\1')", $unicode_c);
	return $unicode_c;
}

entity2utf8onechar方法來自http://blog.sina.com.cn/s /blog_48d7f3f40100o6ak.htmlhtm

使用方式:

$utf8chars = entities2utf8("啊你好啊");

 

轉自:http://www.welefen.com/php-unicode-to-utf8.html

相關文章
相關標籤/搜索