用javascript實(shí)現(xiàn)gb2312轉(zhuǎn)utf-8的腳本
更新時(shí)間:2007年05月16日 00:00:00 作者:
信息交換用漢字編碼字符集-基本集
漢字標(biāo)準(zhǔn)交換碼共分兩級(jí)。第一級(jí)為常用字,有3755字,按漢語(yǔ)拼音字母順序排列,第二級(jí)為次常用字,有3008字,按部首排列。GB2312的編碼范圍為2121H-777EH.
UNICODE 是兩字節(jié)的全編碼,對(duì)于ASCII字符它也使用兩字節(jié)表示。代碼頁(yè)是通過(guò)高字節(jié)的取值范圍來(lái)確定是ASCII字符,還是漢字的高字節(jié)。如果發(fā)生數(shù)據(jù)損壞, 某處內(nèi)容破壞,則會(huì)引起其后漢字的混亂。UNICODE則一律使用兩個(gè)字節(jié)表示一個(gè)字符,最明顯的好處是它簡(jiǎn)化了漢字的處理過(guò)程。
關(guān)于編碼的文章可以參考:
http://blog.iyi.cn/tech/2005/10/unicode_2.html
http://blog.iyi.cn/tech/2005/10/unicode.html
百度的頁(yè)面是gb2312的,URL編碼自然也是從gb轉(zhuǎn)換而來(lái),比如“一”這個(gè)字,百度轉(zhuǎn)換的結(jié)果是D2%BB,而從Utf-8轉(zhuǎn)換來(lái)的結(jié)果是%E4%B8%80比如google(gb是2字節(jié)編碼,utf-8是3字節(jié)變長(zhǎng)編碼)
可以用javascript的encodeURI和decodeURI來(lái)得到這些結(jié)果,設(shè)置頁(yè)面編碼就可以看到不同結(jié)果了。
在網(wǎng)上找,也沒(méi)找到現(xiàn)成的轉(zhuǎn)換程序,只得自己寫。還好網(wǎng)上不缺gb-utf的對(duì)照表,修改了一下就可以用了:gb-utf.txt
這個(gè)對(duì)照表是將gb字節(jié)編碼轉(zhuǎn)到utf的16進(jìn)制編碼,而不是字節(jié)編碼。
javascript中escape和unescape是轉(zhuǎn)換16進(jìn)制編碼用的,因此gb漢字到utf漢字的轉(zhuǎn)換思路是:encodeURI("gb漢字"),到對(duì)照表中查找utf的16進(jìn)制編碼,unescape("16進(jìn)制utf編碼"),得到utf漢字。
中間那一步最關(guān)鍵,我的轉(zhuǎn)換只用到了這一步,其他兩步直接調(diào)用那兩個(gè)函數(shù)就可以了。下面是轉(zhuǎn)換程序:
function genCodeStr(){
var codeRE = new RegExp("'(.*)' : '(.*)'","gi");
var tempStr,codeStr = "";
var myReader = new Reader();
myReader.loadFile('inc/gb2312_utf.txt');//這里改成你的對(duì)照表存放的路徑
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(replaceRE,utfCode);
}
return gbStr;
}
function Reader() { //Class Reader()
this.fso; //Private fso
this.fUri; //Private fUri
this.fStream; //Private fStream
try{
this.fso = new ActiveXObject("Scripting.FileSystemObject");
}catch(exception) {
throw exception;
}
this.loadFile = function(file) { //Public loadFile(file)
this.fUri = Server.mappath(file);
//var fStream = fso.CreateTextFile(tfolder,true,false);
//fStream.WriteLine('test');
if(this.fso.fileExists(this.fUri)){
this.fStream = this.fso.openTextFile(this.fUri);
}else{
Response.write('file dos not exist');
}
}
this.readLineN = function(num) {
var i = 1;
while(i < num && !this.fStream.atEndOfLine) {
this.fStream.skipLine();
i++
}
return this.fStream.readLine();
}
this.closeFile = function() {
fStream.Close();
fso.Close;
}
}
對(duì)照表就是gb-utf.txt了,你自己改一下讀取路徑即可。
還需要注意的是,上面的程序是需要在服務(wù)器端運(yùn)行的,因?yàn)樯婕暗轿募僮鳌?
javascript客戶端程序請(qǐng)看
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
漢字標(biāo)準(zhǔn)交換碼共分兩級(jí)。第一級(jí)為常用字,有3755字,按漢語(yǔ)拼音字母順序排列,第二級(jí)為次常用字,有3008字,按部首排列。GB2312的編碼范圍為2121H-777EH.
UNICODE 是兩字節(jié)的全編碼,對(duì)于ASCII字符它也使用兩字節(jié)表示。代碼頁(yè)是通過(guò)高字節(jié)的取值范圍來(lái)確定是ASCII字符,還是漢字的高字節(jié)。如果發(fā)生數(shù)據(jù)損壞, 某處內(nèi)容破壞,則會(huì)引起其后漢字的混亂。UNICODE則一律使用兩個(gè)字節(jié)表示一個(gè)字符,最明顯的好處是它簡(jiǎn)化了漢字的處理過(guò)程。
關(guān)于編碼的文章可以參考:
http://blog.iyi.cn/tech/2005/10/unicode_2.html
http://blog.iyi.cn/tech/2005/10/unicode.html
百度的頁(yè)面是gb2312的,URL編碼自然也是從gb轉(zhuǎn)換而來(lái),比如“一”這個(gè)字,百度轉(zhuǎn)換的結(jié)果是D2%BB,而從Utf-8轉(zhuǎn)換來(lái)的結(jié)果是%E4%B8%80比如google(gb是2字節(jié)編碼,utf-8是3字節(jié)變長(zhǎng)編碼)
可以用javascript的encodeURI和decodeURI來(lái)得到這些結(jié)果,設(shè)置頁(yè)面編碼就可以看到不同結(jié)果了。
在網(wǎng)上找,也沒(méi)找到現(xiàn)成的轉(zhuǎn)換程序,只得自己寫。還好網(wǎng)上不缺gb-utf的對(duì)照表,修改了一下就可以用了:gb-utf.txt
這個(gè)對(duì)照表是將gb字節(jié)編碼轉(zhuǎn)到utf的16進(jìn)制編碼,而不是字節(jié)編碼。
javascript中escape和unescape是轉(zhuǎn)換16進(jìn)制編碼用的,因此gb漢字到utf漢字的轉(zhuǎn)換思路是:encodeURI("gb漢字"),到對(duì)照表中查找utf的16進(jìn)制編碼,unescape("16進(jìn)制utf編碼"),得到utf漢字。
中間那一步最關(guān)鍵,我的轉(zhuǎn)換只用到了這一步,其他兩步直接調(diào)用那兩個(gè)函數(shù)就可以了。下面是轉(zhuǎn)換程序:
復(fù)制代碼 代碼如下:
function genCodeStr(){
var codeRE = new RegExp("'(.*)' : '(.*)'","gi");
var tempStr,codeStr = "";
var myReader = new Reader();
myReader.loadFile('inc/gb2312_utf.txt');//這里改成你的對(duì)照表存放的路徑
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(replaceRE,utfCode);
}
return gbStr;
}
function Reader() { //Class Reader()
this.fso; //Private fso
this.fUri; //Private fUri
this.fStream; //Private fStream
try{
this.fso = new ActiveXObject("Scripting.FileSystemObject");
}catch(exception) {
throw exception;
}
this.loadFile = function(file) { //Public loadFile(file)
this.fUri = Server.mappath(file);
//var fStream = fso.CreateTextFile(tfolder,true,false);
//fStream.WriteLine('test');
if(this.fso.fileExists(this.fUri)){
this.fStream = this.fso.openTextFile(this.fUri);
}else{
Response.write('file dos not exist');
}
}
this.readLineN = function(num) {
var i = 1;
while(i < num && !this.fStream.atEndOfLine) {
this.fStream.skipLine();
i++
}
return this.fStream.readLine();
}
this.closeFile = function() {
fStream.Close();
fso.Close;
}
}
對(duì)照表就是gb-utf.txt了,你自己改一下讀取路徑即可。
還需要注意的是,上面的程序是需要在服務(wù)器端運(yùn)行的,因?yàn)樯婕暗轿募僮鳌?
javascript客戶端程序請(qǐng)看
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
您可能感興趣的文章:
- 將字符串轉(zhuǎn)換成gb2312或者utf-8編碼的參數(shù)(js版)
- php實(shí)現(xiàn)utf-8和GB2312編碼相互轉(zhuǎn)換函數(shù)代碼
- UTF-8 GBK UTF8 GB2312 之間的區(qū)別和關(guān)系介紹
- PHP字符編碼問(wèn)題之GB2312 VS UTF-8解決方法
- VBS實(shí)現(xiàn)GB2312,UTF-8,Unicode,BIG5編碼轉(zhuǎn)換工具
- PHP 解決utf-8和gb2312編碼轉(zhuǎn)換問(wèn)題
- unicode utf-8 gb18030 gb2312 gbk各種編碼對(duì)比
- ASP中Utf-8與Gb2312編碼轉(zhuǎn)換亂碼問(wèn)題的解決方法 頁(yè)面編碼聲明
- MSSQL轉(zhuǎn)MYSQL,gb2312轉(zhuǎn)utf-8無(wú)亂碼解決方法
- PHP iconv 解決utf-8和gb2312編碼轉(zhuǎn)換問(wèn)題
- ASP UTF-8頁(yè)面亂碼+GB2312轉(zhuǎn)UTF-8 +生成UTF-8格式的文件(編碼)
- 用VBS實(shí)現(xiàn)的批量gb2312轉(zhuǎn)utf-8,支持拖動(dòng)
- [轉(zhuǎn)]ASP實(shí)現(xiàn)關(guān)鍵詞獲取(各搜索引擎,GB2312及UTF-8)
- UTF-8轉(zhuǎn)GB2312函數(shù)
- utf-8編碼轉(zhuǎn)換成gb2312
- 將編碼從GB2312轉(zhuǎn)成UTF-8的方法匯總(從前臺(tái)、程序、數(shù)據(jù)庫(kù))
相關(guān)文章
微信小程序圖片上傳組件實(shí)現(xiàn)圖片拖拽排序
最近在寫小程序過(guò)程中遇到一個(gè)拖拽排序需求,上網(wǎng)一頓搜索未果,遂自行實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于微信小程序圖片上傳組件實(shí)現(xiàn)圖片拖拽排序的相關(guān)資料,需要的朋友可以參考下2022-03-03
在JavaScript中監(jiān)聽(tīng)I(yíng)ME鍵盤輸入事件
在 JavaScript 中監(jiān)聽(tīng)用戶的鍵盤輸入是很容易的事情,但用戶一旦使用了輸入法,問(wèn)題就變得復(fù)雜了。2011-05-05
多個(gè)jquery.datatable共存,checkbox全選異常的快速解決方法
這篇文章主要介紹了多個(gè)jquery.datatable共存,checkbox全選異常的快速解決方法。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12
前端JavaScript經(jīng)典之Promise詳解
Promise是為了解決回調(diào)地獄問(wèn)題而誕生的,它提供了優(yōu)雅的異步回調(diào)解決方案,這篇文章主要介紹了前端JavaScript經(jīng)典之Promise的相關(guān)資料,需要的朋友可以參考下2024-09-09
uniapp中獲取dom元素的方法及更改dom元素顏色踩坑記錄
最近學(xué)到了一個(gè)比較好用的框架uni-app,可以做六端適配,學(xué)習(xí)一下,下面這篇文章主要給大家介紹了關(guān)于uniapp中獲取dom元素的方法及更改dom元素顏色踩坑記錄的相關(guān)資料,需要的朋友可以參考下2023-03-03

