新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     >>计算机科学论坛<<     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论SVG, GML, X3D, VRML, VML, XAML, AVALON, Batik等基于XML的图形技术,以及有关GIS的应用。
    [返回] 计算机科学论坛XML.ORG.CN讨论区 - 高级XML应用『 SVG/GML/VRML/X3D/XAML 』 → javascript gb2312转utf-8 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 8399 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: javascript gb2312转utf-8 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 javascript gb2312转utf-8

    昨天修改referer的时候碰到这个问题.

    信息交换用汉字编码字符集-基本集

    汉字标准交换码共分两级。第一级为常用字,有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客户端程序请看:http://blog.iyi.cn/start/file/gb-utf.htm.(由于编码文件很大,打开可能比较慢)


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/2/7 8:53:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/7/20 8:36:35

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    62.500ms