為什麼這篇Unicode Big5 對照表鄉民發文收入到精華區:因為在Unicode Big5 對照表這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者bobju (寶貝豬)看板PHP標題Re: [請益] PHP 編碼的問題 (Winodws)時間...
這個我以前處理過,只是在win2000下,不知vista下適不適用?
簡單講, 很麻煩. 或許有更好的方法但我不清楚.
我是win2000下, 安裝unicode補完計畫(UAO). 它的日文編碼跟
原來系統預設的big5的日文編碼是不同的. 以下提供程式範例以及
轉換函式類別:
這個ublib類別需要兩個對照表, 就是UAO的unicode=>big5, 以及
big5=>unicode 對照表. 將之存成兩個文字檔, 在呼叫函式轉換時
載入即可.
範例:
<?php
include('_ublib.inc');
$ublib=new ublib;
//載入unicode 2 big5 對照表
$ublib->load_u2b('_u2b.tbl');
//載入big5 2 unicode 對照表
$ublib->load_b2u('_b2u.tbl');
//將big5編碼的檔案內容讀進來, 並轉成utf8
$utf8_content=$ublib->big52utf8(file_get_contents('big5content.txt'));
?>
類別:
<?php
class ublib{
var $b2uTab;
var $u2bTab;
//將big5編碼的字串轉成utf-8編碼的字串傳回
function big52utf8($str){
return iconv('UTF-16LE','UTF-8',$this->b2u_str($str));
}
//將utf-8編碼的字串轉成big5編碼的字串傳回
function utf82big5($str){
return $this->u2b_str(iconv('UTF-8','UTF-16LE',$str));
}
//載入 big5 2 utf-16le 對照表
function &load_b2u($b2u_file){
$this->b2uTab=array();
$stream=str_replace("\r\n","\n",file_get_contents($b2u_file));
$rs=explode("\n",$stream);
$count_rs=count($rs);
for($i=0;$i<$count_rs;$i++){
$fs=explode(' ',$rs[$i]);
$this->b2uTab[$fs[0]]=$fs[1];
}
}
//載入 utf-16le 2 big5 對照表
function &load_u2b($u2b_file){
$this->u2bTab=array();
$stream=str_replace("\r\n","\n",file_get_contents($u2b_file));
$rs=explode("\n",$stream);
$count_rs=count($rs);
for($i=0;$i<$count_rs;$i++){
$fs=explode(' ',$rs[$i]);
$this->u2bTab[$fs[1]]=$fs[0];
}
}
//取得 big5 對應 utf-16le 的字串
function b2u_str($str){
$len=strlen($str);
$idx=0;
$output='';
while($idx<$len){
$ch=substr($str,$idx++,1);
if(ord($ch)<128){
$output.=chr(ord($ch)).chr(0);
continue;
}
$a=sprintf("%02X",ord($ch));
$b=sprintf("%02X",ord(substr($str,$idx++,1)));
$u=$this->b2uTab['0x'.$a.$b];
if($u){
for($i=0;$i<4;$i++){
$c=substr($u,$i+2,1);
$num[$i]=$this->c2d($c);//printf("%s: %d:
%d\n",$c,$this->c2d($c),$num[$i]);
}
$output.=chr($num[2]*16+$num[3]).chr($num[0]*16+$num[1]);
}
}
return $output;
}
//取得 utf-16le 對應 big5 的字串
function u2b_str($str){
$len=strlen($str);
$idx=0;
$output='';
while($idx<$len){
$byte1=sprintf("%02X",ord(substr($str,$idx++,1)));
$byte2=sprintf("%02X",ord(substr($str,$idx++,1)));
if($byte1.$byte2=='FFFE'){//這是 utf-8編碼檔頭識別標記, 略過.
continue;
}
//注意: utf-8的格式是低高位元的順序互換, 所以記得要調位:
$b=$this->u2bTab['0x'.$byte2.$byte1];
//echo sprintf("%s => %s\n",'0x'.$byte2.$byte1,$b);
for($i=0;$i<4;$i++){
$ch=substr($b,$i+2,1);
$num[$i]=$this->c2d($ch);//printf("%s: %d:
%d\n",$c,$this->c2d($c),$num[$i]);
}
$n=$num[0]*16+$num[1];
if($n>0){
$output.=chr($num[0]*16+$num[1]);
}
$output.=chr($num[2]*16+$num[3]);
}
return $output;
}
function c2d($ch){
switch($ch){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
return ord($ch)-48;
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
return (ord($ch)-65)+10;
break;
}
}
}//class ublib
?>
※ 引述《squalll (開始)》之銘言:
: 最近在寫一個php讀取windows下資料夾的程式
: 網頁是utf-8,所以在讀取資料夾的時候透過iconv轉換
: 如 iconv("big5","utf-8", $dir);
: 但是有些資料夾名稱為日文時則會出現錯誤
: ERRNO: 8 TEXT: iconv() [function.iconv]: Detected an illegal character in inpu
: t string LOCATION: Y:\www\dir.php, line 488
: 上網查過似乎可以用Big5-HKSCS,但是我試過還是不行
: 不知道有沒有人遇過類似的問題呢?
: 謝謝^^
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.67.139.64