歡迎來(lái)到 常識(shí)詞典網(wǎng) , 一個(gè)專(zhuān)業(yè)的常識(shí)知識(shí)學(xué)習(xí)網(wǎng)站!
[ Ctrl + D 鍵 ]收藏本站
在UTF-8,與UNICODE之間轉(zhuǎn)換的時(shí)候,用二進(jìn)制運(yùn)算,代替了字符串的轉(zhuǎn)換。UTF-8一個(gè)漢字,用3個(gè)字節(jié),而UNICODE用2個(gè)字節(jié);對(duì)應(yīng)關(guān)系如下:
將UTF-8編碼的字符串轉(zhuǎn)化成GB2312的編碼,沒(méi)有對(duì)應(yīng)編碼的字符串轉(zhuǎn)化為&#DEC; 的格式。如 회=>회
語(yǔ)言:PHP,Javascript
內(nèi)容:瀏覽器用Javascript中encodeURI函數(shù)將字符串(包含非GB2312中字符)編碼,GET請(qǐng)求到服務(wù)器,頁(yè)面編碼均為GB2312,服務(wù)器PHP腳本將請(qǐng)求數(shù)據(jù)轉(zhuǎn)換成GB2312表示。
基礎(chǔ):
1. 單獨(dú)使用iconv函數(shù)只能轉(zhuǎn)換GB2312字符,外文字符無(wú)法轉(zhuǎn)換
2. 沒(méi)有現(xiàn)成的函數(shù)可以用
3. bindec()函數(shù):將二進(jìn)制格式的"01"字符串轉(zhuǎn)換為十進(jìn)制數(shù)
4. decbin()函數(shù):將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制字符串,如decbin(224)="11100000"
思路:因?yàn)閁TF-8分別有1,2,3字節(jié)編碼,中日韓文都是3字節(jié)編碼,處理時(shí)根據(jù)字符編碼中首字節(jié)大小區(qū)分字節(jié)數(shù)量。
1.如首字節(jié)小于128,為ASCII碼
2.128~192,非UTF-8編碼,且處理為&#ord();
3. 192~224, 雙字節(jié)UTF-8編碼
4. 224~240,三字節(jié)編碼
5. 240~248,四字節(jié)編碼
6. 。。。
7. 對(duì)于三字節(jié)編碼的嘗試用iconv轉(zhuǎn)換成GB2312
8. 非GB2312的多字節(jié)字符,嘗試把UTF-8轉(zhuǎn)換成Unicode,再取到Unicode十進(jìn)制值
9. 可以考慮使用位運(yùn)算,也可以用bindec()函數(shù)
程序:
function GetGB2312String($name)
{
$tostr = "";
for($i=0;$i<strlen($name);$i++)
{
$curbin = ord(substr($name,$i,1));
if($curbin < 0x80)
{
$tostr .= substr($name,$i,1);
}elseif($curbin < bindec("11000000")){
$str = substr($name,$i,1);
$tostr .= "&#".ord($str).";";
}elseif($curbin < bindec("11100000")){
$str = substr($name,$i,2);
$tostr .= "&#".GetUnicodeChar($str).";";
$i += 1;
}elseif($curbin < bindec("11110000")){
$str = substr($name,$i,3);
$gstr= iconv("UTF-8","GB2312",$str);
if(!$gstr)
{
$tostr .= "&#".GetUnicodeChar($str).";";
}else{
$tostr .= $gstr;
}
$i += 2;
}elseif($curbin < bindec("11111000")){
$str = substr($name,$i,4);
$tostr .= "&#".GetUnicodeChar($str).";";
$i += 3;
}elseif($curbin < bindec("11111100")){
$str = substr($name,$i,5);
$tostr .= "&#".GetUnicodeChar($str).";";
$i += 4;
}else{
$str = substr($name,$i,6);
$tostr .= "&#".GetUnicodeChar($str).";";
$i += 5;
}
}
return $tostr;
}
function GetUnicodeChar($str)
{
$temp = "";
for($i=0;$i<strlen($str);$i++)
{
$x = decbin(ord(substr($str,$i,1)));
if($i == 0)
{
$s = strlen($str)+1;
$temp .= substr($x,$s,8-$s);
}else{
$temp .= substr($x,2,6);
}
}
return bindec($temp);
}
附:
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
下一篇:以下關(guān)于RDS說(shuō)法有誤的是 下一篇 【方向鍵 ( → )下一篇】
上一篇:網(wǎng)頁(yè)設(shè)計(jì)使用alt標(biāo)簽屬性 上一篇 【方向鍵 ( ← )上一篇】
快搜