免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
PHP Unicode Utf-8 GB2312 Big5 相互轉(zhuǎn)碼解決辦法
PHP Unicode Utf-8 GB2312 Big5 相互轉(zhuǎn)碼解決辦法
2008-04-14 19:53

這個(gè)轉(zhuǎn)換需要以下7個(gè)文件,

big5-gb.tab
big5-unicode.tab
gb-big5.tab
gb-unicode.tab
unicode-big5.tab
unicode-gb.tab

language.inc.php

它們被打包成了gb_big5_unicode.zip,下載地址:http://cn.ziddu.com/download.php?uid=baqalJioba2h4palZrKWlJiiZ66hm5s%3D6

編寫(xiě) PHP 代碼的過(guò)程中,經(jīng)常會(huì)遇到需要對(duì)中文轉(zhuǎn)碼的問(wèn)題,如 GB2312 <=> Unicode、GB2312 <=> Big5 等等。如果 PHP 編譯時(shí)帶有 mbstring 的話(huà),可以使用 Multi-Byte String Function 實(shí)現(xiàn)部分轉(zhuǎn)碼工作。然而由于很多虛擬主機(jī)不支持 mbstring,或者 mbstring 的編譯、配置過(guò)于麻煩,很多 PHP 代碼無(wú)法使用這一序列的函數(shù)。

最近為了解決這個(gè)問(wèn)題,找到一個(gè)不錯(cuò)的項(xiàng)目:PHP News Reader,這是一個(gè)基于 WEB 的新聞閱讀器,支持基于 NNTP (RFC 977) 協(xié)議的新聞文章的閱讀、發(fā)布、刪除、回復(fù)等功能。這個(gè)項(xiàng)目實(shí)現(xiàn)了 GB2312 Big5 Unicode(UTF-8) 之間的相互轉(zhuǎn)碼,這個(gè)正是我所關(guān)心的部分。

使用 CVS 客戶(hù)端(Linux 下直接用命令行就行,Windows 下推薦使用 Tortoise CVS)將項(xiàng)目的代碼 Check Out 出來(lái):

# cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/pnews loginLogging in to :pserver:anonymous@cvs.sourceforge.net:2401/cvsroot/pnewsCVS password: (Press Enter)# cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/pnews co pnewscvs server: Updating pnews…

查看 pnews/language 目錄,此目錄下包含了如下文件:

big5-gb.tabbig5-unicode.tabgb-big5.tabgb-unicode.tabunicode-big5.tabunicode-gb.tab

這些都是用于字符轉(zhuǎn)換的碼表,然后再看看 pnews/language.inc.php 文件,其中包含了幾個(gè)用于編碼轉(zhuǎn)換的函數(shù):

// Big5 => GBfunction b2g( $instr ) { $fp = fopen( 'language/big5-gb.tab', 'r' ); $len = strlen($instr); for( $i = 0 ; $i < $len ; $i++ ) {  $h = ord($instr[$i]);  if( $h >= 160 ) {   $l = ord($instr[$i+1]);   if( $h == 161 && $l == 64 )    $gb = '  ';   else {    fseek( $fp, (($h-160)*255+$l-1)*3 );    $gb = fread( $fp, 2 );   }   $instr[$i] = $gb[0];   $instr[$i+1] = $gb[1];   $i++;  } } fclose($fp); return $instr;}// GB => BIG5function g2b( $instr ) { $fp = fopen( 'language/gb-big5.tab', 'r' ); $len = strlen($instr); for( $i = 0 ; $i < $len ; $i++ ) {  $h = ord($instr[$i]);  if( $h > 160 && $h < 248 ) {   $l = ord($instr[$i+1]);   if( $l > 160 && $l < 255 ) {    fseek( $fp, (($h-161)*94+$l-161)*3 );    $bg = fread( $fp, 2 );   }   else    $bg = '  ';   $instr[$i] = $bg[0];   $instr[$i+1] = $bg[1];   $i++;  } } fclose($fp); return $instr;}// Big5 => Unicode(UtF-8)function b2u( $instr ) { $fp = fopen( 'language/big5-unicode.tab', 'r' ); $len = strlen($instr); $outstr = ''; for( $i = $x = 0 ; $i < $len ; $i++ ) {  $h = ord($instr[$i]);  if( $h >= 160 ) {   $l = ord($instr[$i+1]);   if( $h == 161 && $l == 64 )    $uni = '  ';   else {    fseek( $fp, ($h-160)*510+($l-1)*2 );    $uni = fread( $fp, 2 );   }   $codenum = ord($uni[0])*256 + ord($uni[1]);   if( $codenum < 0x800 ) {    $outstr[$x++] = chr( 192 + $codenum / 64 );    $outstr[$x++] = chr( 128 + $codenum % 64 );#    printf("[%02X%02X]<br>n", ord($outstr[$x-2]), ord($uni[$x-1]) );   }   else {    $outstr[$x++] = chr( 224 + $codenum / 4096 );    $codenum %= 4096;    $outstr[$x++] = chr( 128 + $codenum / 64 );    $outstr[$x++] = chr( 128 + ($codenum % 64) );#    printf("[%02X%02X%02X]<br>n", ord($outstr[$x-3]), ord($outstr[$x-2]), ord($outstr[$x-1]) );   }   $i++;  }  else   $outstr[$x++] = $instr[$i]; } fclose($fp); if( $instr != '' )  return join( '', $outstr);}// Unicode(UTF-8) => BIG5function u2b( $instr ) { $fp = fopen( 'language/unicode-big5.tab', 'r' ); $len = strlen($instr); $outstr = ''; for( $i = $x = 0 ; $i < $len ; $i++ ) {  $b1 = ord($instr[$i]);  if( $b1 < 0x80 ) {   $outstr[$x++] = chr($b1);#   printf( "[%02X]", $b1);  }  elseif( $b1 >= 224 ) { # 3 bytes UTF-8   $b1 -= 224;   $b2 = ord($instr[$i+1]) - 128;   $b3 = ord($instr[$i+2]) - 128;   $i += 2;   $uc = $b1 * 4096 + $b2 * 64 + $b3 ;   fseek( $fp, $uc * 2 );   $bg = fread( $fp, 2 );   $outstr[$x++] = $bg[0];   $outstr[$x++] = $bg[1];#   printf( "[%02X%02X]", ord($bg[0]), ord($bg[1]));  }  elseif( $b1 >= 192 ) { # 2 bytes UTF-8   printf( "[%02X%02X]", $b1, ord($instr[$i+1]) );   $b1 -= 192;   $b2 = ord($instr[$i]) - 128;   $i++;   $uc = $b1 * 64 + $b2 ;   fseek( $fp, $uc * 2 );   $bg = fread( $fp, 2 );   $outstr[$x++] = $bg[0];   $outstr[$x++] = $bg[1];#   printf( "[%02X%02X]", ord($bg[0]), ord($bg[1]));  } } fclose($fp); if( $instr != '' ) {#  echo '##' . $instr . " becomes " . join( '', $outstr) . "<br>n";  return join( '', $outstr); }}// GB => Unicode(UTF-8)function g2u( $instr ) { $fp = fopen( 'language/gb-unicode.tab', 'r' ); $len = strlen($instr); $outstr = ''; for( $i = $x = 0 ; $i < $len ; $i++ ) {  $h = ord($instr[$i]);  if( $h > 160 ) {   $l = ord($instr[$i+1]);   fseek( $fp, ($h-161)*188+($l-161)*2 );   $uni = fread( $fp, 2 );   $codenum = ord($uni[0])*256 + ord($uni[1]);   if( $codenum < 0x800 ) {    $outstr[$x++] = chr( 192 + $codenum / 64 );    $outstr[$x++] = chr( 128 + $codenum % 64 );#    printf("[%02X%02X]<br>n", ord($outstr[$x-2]), ord($uni[$x-1]) );   }   else {    $outstr[$x++] = chr( 224 + $codenum / 4096 );    $codenum %= 4096;    $outstr[$x++] = chr( 128 + $codenum / 64 );    $outstr[$x++] = chr( 128 + ($codenum % 64) );#    printf("[%02X%02X%02X]<br>n", ord($outstr[$x-3]), ord($outstr[$x-2]), ord($outstr[$x-1]) );   }   $i++;  }  else   $outstr[$x++] = $instr[$i]; } fclose($fp); if( $instr != '' )  return join( '', $outstr);}// Unicode(UTF-8) => GBfunction u2g( $instr ) { $fp = fopen( 'language/unicode-gb.tab', 'r' ); $len = strlen($instr); $outstr = ''; for( $i = $x = 0 ; $i < $len ; $i++ ) {  $b1 = ord($instr[$i]);  if( $b1 < 0x80 ) {   $outstr[$x++] = chr($b1);#   printf( "[%02X]", $b1);  }  elseif( $b1 >= 224 ) { # 3 bytes UTF-8   $b1 -= 224;   $b2 = ord($instr[$i+1]) - 128;   $b3 = ord($instr[$i+2]) - 128;   $i += 2;   $uc = $b1 * 4096 + $b2 * 64 + $b3 ;   fseek( $fp, $uc * 2 );   $gb = fread( $fp, 2 );   $outstr[$x++] = $gb[0];   $outstr[$x++] = $gb[1];#   printf( "[%02X%02X]", ord($gb[0]), ord($gb[1]));  }  elseif( $b1 >= 192 ) { # 2 bytes UTF-8   printf( "[%02X%02X]", $b1, ord($instr[$i+1]) );   $b1 -= 192;   $b2 = ord($instr[$i]) - 128;   $i++;   $uc = $b1 * 64 + $b2 ;   fseek( $fp, $uc * 2 );   $gb = fread( $fp, 2 );   $outstr[$x++] = $gb[0];   $outstr[$x++] = $gb[1];#   printf( "[%02X%02X]", ord($gb[0]), ord($gb[1]));  } } fclose($fp); if( $instr != '' ) {#  echo '##' . $instr . " becomes " . join( '', $outstr) . "<br>n";  return join( '', $outstr); }}

在自己的 PHP 文件中需要轉(zhuǎn)碼時(shí),只需要 .tab 碼表文件及相對(duì)應(yīng)的轉(zhuǎn)碼函數(shù),將函數(shù)中的 fopen 打開(kāi)的文件路徑修改為正確的路徑即可。

PS:有時(shí)候,網(wǎng)頁(yè)中出現(xiàn)的 Unicode 編碼是十六進(jìn)制的,比如 "廬山" 被編碼成了 "%u5E90%u5C71",而上面所提到的函數(shù)只能處理十進(jìn)制的 Unicode 編碼,所以,首先要從十六進(jìn)制 Unicode 編碼轉(zhuǎn)換成十進(jìn)制 Unicode 編碼,下面的函數(shù)即實(shí)現(xiàn)了這種轉(zhuǎn)換:

// Unicode Hex => Unicode Decfunction UnicodeHexToDec( $uhStr )
{
   $gbStr = "";
   $uhArray = split( "%u", substr($uhStr, 2) );
   foreach( $uhArray as $udChar )
   {
    $udChar = hexdec( $udChar );
    $gbStr .= "&#".$udChar.";";
   }

   return $gbStr;
}

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
用php實(shí)現(xiàn)gb2312和unicode間的編碼轉(zhuǎn)換 編碼轉(zhuǎn)換
php對(duì)gb編碼動(dòng)態(tài)轉(zhuǎn)utf-8編碼的幾種方法評(píng)測(cè)
python chr()、unichr()和ord()
PHP 的 UNICODE 編碼和解碼
第一個(gè)python去掉行號(hào)
java mysql 備份
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服