2007年10月23日 星期二

計算中文 big5 在編碼中的順序

//計算中文 big5 在編碼中的順序
//高位元區段 81-8D 8E-A0 A1-FE ---->126個
//低位元區段 40-7E A1-FE ---> 157 個
//先計算高位元的距離 公式:(高位元 - 0x81) * 157
//再計算低位元距離 分為兩組 40-7E A1-FE
//0x40=64 0x7E=126 63個
//0xA1=161 0xFE=254 94個
//落在 0x40-0x7E 直接加上 (低位元的值 - 0x40 + 1)
//落在 0xA1-0xFE 63 + (低位元的值 - 0xA1 + 1)

// PHP

<?php
function big5order($big5){
$big5_h = $big5[0] . $big5[1];
$big5_l = $big5[2] . $big5[3];int big5order(unsigned short big5){
unsigned short big5order;
unsigned char hi, lo;

hi = (big5 & 0xFF00) >> 0x08;
lo = big5 &0x00FF;

big5order = (hi - 0x81) * 157;

if(lo>=0x40 && lo<=0x7E)
big5order = big5order + lo - 0x40 + 1;
else if(lo>=0xA1 && lo<=0xFE)
big5order = big5order + 63 + lo - 0xA1 + 1;

return big5order;
}

?>

// C/C++

int big5order(unsigned short big5){
unsigned short big5order;
unsigned char hi, lo;

hi = (big5 & 0xFF00) >> 0x08;
if(!(hi>=0x81 && hi<=0xFE)) return -1;

lo = big5 &0x00FF;
if(!((lo>=0x40 && lo<=0x7E) (lo>=0xA1 && lo<=0xFE))) return -2;

big5order = (hi - 0x81) * 157;

if(lo>=0x40 && lo<=0x7E)
big5order = big5order + lo - 0x40 + 1;
else if(lo>=0xA1 && lo<=0xFE)
big5order = big5order + 63 + lo - 0xA1 + 1;

return big5order;
}

沒有留言: