利用php將UTF-8 -> big5 UAO沒有PATCH iconv

最近因為嘗試要轉換一些HTML->BBS的文章會發生的問題,所以說就寫了一個這樣的程式,因為我完全不想要動到iconv的PATCH,所以說就先利用ZTerm src中的BIG5表格下去做轉換,結果還不錯。

(修正了幾個bug 091006 21:00)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
/*  
 *  This php is using GNU General Public License v2.0
 *  renn999<AT>ccns.ncku.edu.tw
 *  http://renn999.twbbs.org
 *
 *  USAGE:ucs2big5( $str );
 *  
 *  Big5 table(big5.txt)
 *  using from Ztrem
 *  http://zhouer.org/ZTerm/
 */

function ucs2big5($ucs_str) {
    $fp = fopen( 'big5.txt', 'r' );
    $len = strlen($ucs_str);
    unset($big5_str);

    $x = 0;
    for( $i = 0 ; $i < $len ; $i++ ) {
        $b1 = ord($ucs_str[$i]);
        if( $b1 < 0x80 ) {
            $big5_str[$x++] = chr($b1);
        }
        elseif( $b1 >= 224 ) {
            #3code UTF-8
            $b1 -= 224;
            $b2 = ord($ucs_str[++$i]) - 128;
            $b3 = ord($ucs_str[++$i]) - 256;
            $ucs_code = $b1 * 4096 + $b2 * 64 + $b3;
            fseek( $fp, $ucs_code * 2);
            $big5_code = fread( $fp, 2 );
            $big5_str[$x++] = $big5_code[0];
            $big5_str[$x++] = $big5_code[1];
        }
        elseif( $b1 >= 192 ) {
            #2code UTF-8
            $b1 -= 192;
            $b2 = ord($ucs_str[++$i]) - 256;
            $ucs_code = $b1 * 64 + $b2 ;
            fseek( $fp, $ucs_code * 2 );
            $big5_code = fread( $fp, 2 );
            $big5_str[$x++] = $big5_code[0];
            $big5_str[$x++] = $big5_code[1];
        }else{
            $big5_str[$x++] = '?';
        }
    }

    fclose($fp);
    if(isset($big5_str)) {
        return join( '', $big5_str);
    }
}
?>

至於BIG5.txt可以到http://zterm.googlecode.com/svn/trunk/org/zhouer/utils/conv/中去下載 這裡就不附上了

Tue Oct. 6 2009
Comments

Comments