漢字標准交換碼共分兩級。第一級為常用字,有3755字,按漢語拼音字母順序排列,第二級為次常用字,有3008字,按部首排列。GB2312的編碼范圍為2121H-777EH.
UNICODE 是兩字節的全編碼,對於ASCII字符它也使用兩字節表示。代碼頁是通過高字節的取值范圍來確定是ASCII字符,還是漢字的高字節。如果發生數據損壞, 某處內容破壞,則會引起其後漢字的混亂。UNICODE則一律使用兩個字節表示一個字符,最明顯的好處是它簡化了漢字的處理過程。
關於編碼的文章可以參考:
百度的頁面是gb2312的,URL編碼自然也是從gb轉換而來,比如“一”這個字,百度轉換的結果是D2%BB,而從Utf-8轉換來的結果是%E4%B8%80比如google(gb是2字節編碼,utf-8是3字節變長編碼)
可以用javascript的encodeURI和decodeURI來得到這些結果,設置頁面編碼就可以看到不同結果了。
在網上找,也沒找到現成的轉換程序,只得自己寫。還好網上不缺gb-utf的對照表,修改了一下就可以用了:gb-utf.txt
這個對照表是將gb字節編碼轉到utf的16進制編碼,而不是字節編碼。
javascript中escape和unescape是轉換16進制編碼用的,因此gb漢字到utf漢字的轉換思路是:encodeURI("gb漢字"),到對照表中查找utf的16進制編碼,unescape("16進制utf編碼"),得到utf漢字。
中間那一步最關鍵,我的轉換只用到了這一步,其他兩步直接調用那兩個函數就可以了。下面是轉換程序:
function genCodeStr(){
var codeRE = new RegExp("'(.*)' : '(.*)'","gi");
var tempStr,codeStr = "";
var myReader = new Reader();
myReader.loadFile('inc/gb2312_utf.txt');//這裡改成你的對照表存放的路徑
while(!myReader.fStream.atEndofLine) {
tempStr = new String(myReader.fStream.readLine());
codeStr += tempStr.replace(codeRE,"$1") + ":" + tempStr.replace(codeRE,"$2") + ":";
}
Application("codeData") = codeStr;
}
function getCodeStr(){
var codeStr = new String(Application("codeData"));
if(codeStr.indexOf("%a1%a1") == -1){
genCodeStr();
}
return new String(Application("codeData"));
}
function gb2utf(gbStr){
var codeStr = getCodeStr();
var codeRE = new RegExp("(%..%..)","gi");
var replaceRE = new RegExp("(%..%..)","i");
var gbCode;
var utfCode;
var gbStart;
while((codeRE.lastIndex < gbStr.length) && replaceRE.test(gbStr)){
codeRE.exec(gbStr);
gbCode = new String(RegExp.$1);
gbStart = new Number(codeStr.indexOf(gbCode.toLowerCase()));
var utfStart = 0;
if(gbStart != -1){
utfStart= gbStart + 7;
utfCode = codeStr.substring(utfStart,utfStart + 6);
}else{
utfCode = "%u3000";
}
gbStr = gbStr.replace