Re: [請益] PHP 編碼的問題 (Winodws)

看板PHP作者 (寶貝豬)時間16年前 (2009/06/05 20:03), 編輯推噓0(003)
留言3則, 2人參與, 最新討論串2/2 (看更多)
這個我以前處理過,只是在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

06/05 20:03, , 1F
僅供參考.畢竟有段時間沒維護,不確定是否run得順.
06/05 20:03, 1F
※ 編輯: bobju 來自: 203.67.139.64 (06/05 20:20)

06/05 20:21, , 2F
第一次張貼的範例錯得離譜, 現在已修訂.
06/05 20:21, 2F

06/09 22:27, , 3F
非常謝謝^^ 我在試試看
06/09 22:27, 3F
文章代碼(AID): #1AAGc7Qf (PHP)
討論串 (同標題文章)
文章代碼(AID): #1AAGc7Qf (PHP)