2009年8月11日 星期二

UNICODE的一些處理方式

/* 將 文字 轉換成 '12345' 或 '〹' */

// 使用 iconv
$unicode = base_convert(bin2hex(iconv('UTF-8', 'UCS-4', $string)), 16, 10);

// 使用 mb_convert_encoding
$unicode = base_convert(bin2hex(mb_convert_encoding($string, 'ucs-4', 'utf-8')), 16, 10);

// 補上 &#xxxxx;
$unicode = '&#' . base_convert(bin2hex(iconv("utf-8", "ucs-4", $str)), 16, 10) . ';'; 

// 將 &#12345 轉回 文字
$string = mb_convert_encoding($unicode, 'UTF-8', 'HTML-ENTITIES'); 

$str = "温"; $unicodeHtml = base_convert(bin2hex(iconv("utf-8", "ucs-2", $str)), 16, 10); print "&#".$unicodeHTML.";" // 顯示結果 温


unicode html 轉回文字,由於 php 沒有 hex2bin 的函式,所以我們自己簡單的寫一個來用。

<?php function hex2bin($string) {     $len = strlen($string);     retunr pack("H".$len, $string); } $str = "28201"; $unicodeHtml = iconv("ucs-2", "utf-8", hex2bin(base_convert($str, 10, 16))); print $unicodeHtml; // 顯示結果 温
?>

線上轉換網站


/////////////////////////////////////////////////////////////////////////
//
// UTF-8轉換為UNICODE
//
//
/////////////////////////////////////////////////////////////////////////

function numeric_code_utf8($utf8_string) { 
$out = ""; 
$ns = strlen ($utf8_string); 
for ($nn = 0; $nn < $ns; $nn++) { 
$ch = $utf8_string[$nn]; 
$ii = ord ($ch); 

if ($ii < 128) 
        $out .= $ch; 
else if ($ii >>5 == 6) { 
$b1 = ($ii & 31); 
$nn++; 
$ch = $utf8_string [$nn]; 
$ii = ord ($ch); 
$b2 = ($ii & 63); 
$ii = ($b1 * 64) + $b2; 
$ent = sprintf ("&#%d;", $ii); 
$out .= $ent; 
else if ($ii >>4 == 14) { 
$b1 = ($ii & 31); 
$nn++; 
$ch = $utf8_string [$nn]; 
$ii = ord ($ch); 
$b2 = ($ii & 63); 
$nn++; 
$ch = $utf8_string [$nn]; 
$ii = ord ($ch); 
$b3 = ($ii & 63); 
$ii = ((($b1 * 64) + $b2) * 64) + $b3; 
$ent = sprintf ("&#%d;", $ii); 
$out .= $ent; 
else if ($ii >>3 == 30) { 
$b1 = ($ii & 31); 
$nn++; 
$ch = $utf8_string [$nn]; 
$ii = ord ($ch); 
$b2 = ($ii & 63); 
$nn++; 
$ch = $utf8_string [$nn]; 
$ii = ord ($ch); 
$b3 = ($ii & 63); 
$nn++; 
$ch = $utf8_string [$nn]; 
$ii = ord ($ch); 
$b4 = ($ii & 63); 
$ii = ((((($b1 * 64) + $b2) * 64) + $b3) * 64) + $b4; 
$ent = sprintf ("&#%d;", $ii); 
$out .= $ent; 
return $out; 
}


function BIG5_string($name){

 //判別中文是否能轉換為BIG5碼,若不行則以unicode&#XXXX顯示
 
$tname=@iconv("utf-8","big5",$name);
if( mb_strlen($name,"utf-8")  <>  mb_strlen($tname,"big5")  )
{
$per_name_big5="";
for($ai=0;$ai < mb_strlen($name,"UTF-8");$ai++)
{
$str_tmp=mb_substr($name,$ai,1,"UTF-8");
$str_tmp_big5=@iconv("utf-8","big5",$str_tmp);
if( mb_strlen($str_tmp_big5,"big5") ==0 )
{
echo "$str_tmp <br>";
$per_name_big5 .=  "&#".base_convert(bin2hex(iconv("utf-8", "ucs-2", $str_tmp)), 16, 10);
}
else $per_name_big5 .=$str_tmp_big5;    
}
}else $per_name_big5=$name;




  return $per_name_big5;
}