源码网,源码论坛,源码之家,商业源码,游戏源码下载,discuz插件,棋牌源码下载,精品源码论坛

 找回密码
 立即注册
查看: 248|回复: 18

[JavaScript] 用javascript实现gb2312转utf-8的脚本

[复制链接]

7万

主题

861

回帖

32万

积分

论坛元老

Rank: 8Rank: 8

积分
329525
发表于 2007-5-16 00:00:00 | 显示全部楼层 |阅读模式
信息交换用汉字编码字符集-基本集
汉字标准交换码共分两级。第一级为常用字,有3755字,按汉语拼音字母顺序排列,第二级为次常用字,有3008字,按部首排列。GB2312的编码范围为2121H-777EH.
UNICODE 是两字节的全编码,对于ASCII字符它也使用两字节表示。代码页是通过高字节的取值范围来确定是ASCII字符,还是汉字的高字节。如果发生数据损坏, 某处内容破坏,则会引起其后汉字的混乱。UNICODE则一律使用两个字节表示一个字符,最明显的好处是它简化了汉字的处理过程。
关于编码的文章可以参考:
http://blog.iyi.cn/tech/2005/10/unicode_2.html
http://blog.iyi.cn/tech/2005/10/unicode.html

百度的页面是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(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; 
    } 
}  

对照表就是gb-utf.txt了,你自己改一下读取路径即可。

还需要注意的是,上面的程序是需要在服务器端运行的,因为涉及到文件操作。
javascript客户端程序请看

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
回复

使用道具 举报

0

主题

1万

回帖

100

积分

注册会员

Rank: 2

积分
100
发表于 2022-9-20 10:21:02 | 显示全部楼层
8888888888888888
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2022-10-14 20:30:41 | 显示全部楼层
额头额定法国队是范德萨
回复 支持 反对

使用道具 举报

29

主题

2万

回帖

194

积分

注册会员

Rank: 2

积分
194
发表于 2023-1-18 23:50:18 | 显示全部楼层
那三门,你们谁寂寞才快乐撒
回复 支持 反对

使用道具 举报

2

主题

2万

回帖

69

积分

注册会员

Rank: 2

积分
69
发表于 2023-6-22 23:10:22 | 显示全部楼层
66666666666666666666
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-8-1 11:15:42 | 显示全部楼层
搞个免费的用用
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2024-3-22 18:30:11 | 显示全部楼层
hi哦回复iOS就看见
回复 支持 反对

使用道具 举报

16

主题

2万

回帖

174

积分

注册会员

Rank: 2

积分
174
发表于 2024-5-29 12:40:10 | 显示全部楼层
好人好人好人好人
回复 支持 反对

使用道具 举报

27

主题

2万

回帖

331

积分

中级会员

Rank: 3Rank: 3

积分
331
发表于 2024-8-27 05:54:01 | 显示全部楼层
呵呵呵呵呵呵呵a
回复 支持 反对

使用道具 举报

6

主题

2万

回帖

425

积分

中级会员

Rank: 3Rank: 3

积分
425
发表于 2024-9-2 06:22:51 | 显示全部楼层
看看看咋么
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

手机版|小黑屋|网站地图|源码论坛 ( 海外版 )

GMT+8, 2024-11-24 12:29 , Processed in 0.322371 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表