歡迎來到 常識詞典網 , 一個專業的常識知識學習網站!
[ Ctrl + D 鍵 ]收藏本站
在UTF-8,與UNICODE之間轉換的時候,用二進制運算,代替了字符串的轉換。UTF-8一個漢字,用3個字節,而UNICODE用2個字節;對應關系如下:
將UTF-8編碼的字符串轉化成GB2312的編碼,沒有對應編碼的字符串轉化為&#DEC; 的格式。如 회=>회
語言:PHP,Javascript
內容:瀏覽器用Javascript中encodeURI函數將字符串(包含非GB2312中字符)編碼,GET請求到服務器,頁面編碼均為GB2312,服務器PHP腳本將請求數據轉換成GB2312表示。
基礎:
1. 單獨使用iconv函數只能轉換GB2312字符,外文字符無法轉換
2. 沒有現成的函數可以用
3. bindec()函數:將二進制格式的"01"字符串轉換為十進制數
4. decbin()函數:將十進制數轉換為二進制字符串,如decbin(224)="11100000"
思路:因為UTF-8分別有1,2,3字節編碼,中日韓文都是3字節編碼,處理時根據字符編碼中首字節大小區分字節數量。
1.如首字節小于128,為ASCII碼
2.128~192,非UTF-8編碼,且處理為&#ord();
3. 192~224, 雙字節UTF-8編碼
4. 224~240,三字節編碼
5. 240~248,四字節編碼
6. 。。。
7. 對于三字節編碼的嘗試用iconv轉換成GB2312
8. 非GB2312的多字節字符,嘗試把UTF-8轉換成Unicode,再取到Unicode十進制值
9. 可以考慮使用位運算,也可以用bindec()函數
程序:
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
下一篇:以下關于RDS說法有誤的是 下一篇 【方向鍵 ( → )下一篇】
上一篇:網頁設計使用alt標簽屬性 上一篇 【方向鍵 ( ← )上一篇】
快搜