請參閱 http://web.dhjh.tcc.edu.tw/~gzqbyr/foru ... ic.php?t=1
參考資料:
http://www.cl.cam.ac.uk/~mgk25/unicode.html
http://zh.wikipedia.org/wiki/UTF-8
http://www-128.ibm.com/developerworks/c ... index.html
http://www.linuxforum.net/books/UTF-8-Unicode.html
Unicode 的編碼和實現
Unicode(萬國碼、統一碼)是一種在計算機(電腦)上使用的字符(字元)編碼。它為每種語言中的每個字符設定了統一並且唯一的二進制編碼,以滿足跨語言、跨平台進行文件轉換、處理的要求。1990年開始研發,1994年正式公布。隨著計算機工作能力的增強,Unicode也在面世以來得到普及。
編碼方式:
Unicode 的編碼方式與 ISO 10646 的通用字符集(Universal Character Set,UCS)概念相對應,使用16位的編碼空間。也就是每個字符占用2個字節(位元組byte),基本上滿足了各種語言的使用。
實現方式:
Unicode 的實現方式不同於編碼方式。一個字符的 Unicode 編碼是確定的。但是在實際傳輸過程中,由於不同系統平台的設計不一定一致,以及出於節省空間的目的,對 Unicode 編碼的實現方式有所不同。Unicode 的實現方式稱為Unicode轉換格式(Unicode Translation Format,簡稱為 UTF)。
例如,如果一個僅包含基本7位ASCII字符的 Unicode 文件,如果每個字符都使用2字節的原 Unicode 編碼傳輸,其第一字節的8位始終為0。這就造成了比較大的浪費。對於這種情況,可以使用 UTF-8 編碼。
XML 和 Unicode:
XML及其子集HTML採用UTF-8作為標准字集,理論上我們可以在各種支持XML標准的瀏覽器上顯示任何地區文字的網頁,只要電腦本身安裝有合適的字體即可。可以利用&#nnn;的格式顯示特定的字符。nnn代表該字符的十進制 Unicode 代碼。如果採用十六進制代碼,在編碼之前加上x字符即可。但部分舊版本的瀏覽器可能無法識別十六進制代碼。
UTF-8
UTF-8的編碼模式:
* UCS 字符 U+0000 到 U+007F (ASCII) 被編碼為字節 0x00 到 0x7F (ASCII 兼容). 這意味著只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 兩種編碼方式下是一樣的.
* 所有 >U+007F 的 UCS 字符被編碼為一個多個字節的串, 每個字節都有標記位集. 因此, ASCII 字節 (0x00-0x7F) 不可能作為任何其他字符的一部分.
* 表示非 ASCII 字符的多字節串的第一個字節總是在 0xC0 到 0xFD 的範圍裡, 並指出這個字符包含多少個字節. 多字節串的其餘字節都在 0x80 到 0xBF 範圍裡.
UTF-8儲存的字元,除了第一個位元組外,其餘位元組的頭兩個位元都是以 "10" 開始,使文字處理器能夠較快地找出每個字元的開始位置。
代碼: 選擇全部
* 0xxxxxxx (00-7f)
* 110xxxxx 10xxxxxx (c0-df)(80-bf)
* 1110xxxx 10xxxxxx 10xxxxxx (e0-ef)(80-bf)(80-bf)
* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (f0-f7)(80-bf)(80-bf)(80-bf)
* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx (f8-fb)(80-bf)(80-bf)(80-bf)(80-bf)
* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx (fc-fd)(80-bf)(80-bf)(80-bf)(80-bf)(80-bf)
11000010 10101001 = 0xC2 0xA9
而字符 U+2260 = 0010 0010 0110 0000 (不等於) 編碼為:
11100010 10001001 10100000 = 0xE2 0x89 0xA0
UTF-8 與 Unciode 的 PHP 碼轉換:
底下 Javascript 碼取得'貓'的 unicode, 注意: charset=big5
代碼: 選擇全部
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<script>
var Str = "貓";
TempStr = Str.charCodeAt(0);
document.write(TempStr);
</script>
代碼: 選擇全部
$uni_code = 0x4ed7; // 仗 的 unicode 編碼 0x4ed7;
echo '&#'.$uni_code.'<br>';
$utf8_char = uni2utf($uni_code);
echo $utf8_char.'<br>';
$uni_code = utf2uni($utf8_char);
echo '&#'.$uni_code.'<br>';
// Return utf-8 character
function uni2utf($uni_code)
{
if ($uni_code<0x80) return chr($uni_code);
$i=0;
$outstr='';
while ($uni_code>63) // 2^6=64
{
$outstr=chr($uni_code%64+0x80).$outstr;
$uni_code=floor($uni_code/64);
$i++;
}
switch($i)
{
case 1:
$outstr=chr($uni_code+0xC0).$outstr;break;
case 2:
$outstr=chr($uni_code+0xE0).$outstr;break;
case 3:
$outstr=chr($uni_code+0xF0).$outstr;break;
case 4:
$outstr=chr($uni_code+0xF8).$outstr;break;
case 5:
$outstr=chr($uni_code+0xFC).$outstr;break;
default:
echo "unicode error!!";exit;
}
return $outstr;
}
// Return unicode
function utf2uni($utf8_char)
{
$ch=ord(substr($utf8_char,0,1));
if ($ch<0x80) return $ch;
if ($ch>0xBF && $ch<0xFE)
{
if ($ch<0xE0) {
$i=1;
$uni_code=$ch-0xC0;
} elseif ($ch<0xF0) {
$i=2;
$uni_code=$ch-0xE0;
} elseif ($ch<0xF8) {
$i=3;
$uni_code=$ch-0xF0;
} elseif ($ch<0xFC) {
$i=4;
$uni_code=$ch-0xF8;
} else {
$i=5;
$uni_code=$ch-0xFC;
}
} else {
echo "UTF-8 code error!!";exit;
}
for ($j=0;$j<$i;$j++)
{
$ch=ord(substr($utf8_char,$j+1,1))-0x80;
$uni_code=$uni_code*64+$ch;
}
return $uni_code;
}
代碼: 選擇全部
$fd = fopen("gb2big.map",'r');
$str1 = fread($fd,filesize("gb2big.map"));
fclose($fd);
for ($i=0;$i<strlen($str1);$i=$i+4)
{
$ch1=ord(substr($str1,$i,1))*256;
$ch2=ord(substr($str1,$i+1,1));
$ch1=$ch1+$ch2;
$ch3=ord(substr($str1,$i+2,1))*256;
$ch4=ord(substr($str1,$i+3,1));
$ch3=$ch3+$ch4;
echo '&#'.$ch1.', &#'.$ch3.'<br>';
}