您现在的位置: 365建站网 > 365文章 > js中用gb2312编码解码

js中用gb2312编码解码

文章来源:365jz.com     点击数:930    更新时间:2009-12-30 23:55   参与评论

需求

在js中将中文用gb2312编码。如,“我”编码后应该是“%CE%D2”。

 

分析

大家知道,encodeURI和encodeURIComponent会用utf-8编码,如“我”编码后是“%E6%88%91”。据实验,似乎没有参数指定编码的地方。只有另寻他法。

大致分析有如下几种解决方案:

1. 用js创建一个隐藏的iframe并指定其为gb2312编码,将需要转换的文本放到iframe的form的一个input中,将form指定为get方式并提交,

然后获取其url并解析,应该可以得到其gb2312编码后的文本。

2. 用ajax传到服务器上编码,然后传回来。

3. 在js中创建一个gb2312编码表。

 

实现

第一种方案个人感觉太折腾,需要在多个不同的浏览器下测试。

第二种方案需要有服务器配合。

下面是第三种方案的实现:

最开始打算使用数组存储编码表,后来为了减小js文件大小,改用string来存储。

于是,js代码如下:

 

代码

</>code

  1. function encodeToGb2312(str){
    var strOut="";
    for(var i = 0; i < str.length; i++){
    var c = str.charAt(i);
    var code = str.charCodeAt(i);
    if(c==" ") strOut +="+";
    else if(code >= 19968 && code <= 40869){
    index
    = code - 19968;
    strOut
    += "%" + z.substr(index*4,2) + "%" + z.substr(index*4+2,2);
    }
    else{
    strOut
    += "%" + str.charCodeAt(i).toString(16);
    }
    }
    return strOut;
    }
    function decodeFromGb2312(str){
    var strOut = '';
    for (var i=0;i<str.length; i++){
    var c = str.charAt(i);
    // +是空格
    if (c == '+'){
    strOut
    += ' ';
    }
    // a,b,c,1,2等,非%开头的,直接返回本身
    else if (c != '%'){
    strOut
    += c;
    }
    // %开头
    else{
    i
    ++;
    var nextC = str.charAt(i);
    // 数字,则不是汉字
    if (!isNaN(parseInt(nextC))){
    i
    ++;
    strOut
    += decodeURIComponent(c+nextC+str.charAt(i));
    }
    else{
    var x = new String();
    try
    {
    var code = str.substr(i,2)+str.substr(i+3,2);
    i
    = i + 4;

    var index = -1;
    while ((index = z.indexOf(code,index+1)) != -1){
    if (index%4 == 0){
    strOut
    += String.fromCharCode(index/4+19968);
    break;
    }
    }
    }
    catch(e){}
    }
    }
    }
    return strOut;
    }
    var z='{0}';

(这里没考虑中文标点,主要是看unicode里中文标点和日韩的标点混在一起,分布在几个地方,就懒得弄了。谁弄了可以发我一份,谢了。)

最后用.NET生成z处的代码:

 

代码

</>code

  1. StringBuilder sb = new StringBuilder();
    string strFormat
    = @"...z = '"; // 前面的js代码
    const int MinHanzi = 19968;
    const
    int MaxHanzi = 40869;
    for (int i = MinHanzi; i < MaxHanzi + 1; i++)
    {
    byte[] bytes = Encoding.GetEncoding("gb2312").GetBytes(((char)i).ToString());
    sb.AppendFormat(
    "{0}{1}", Convert.ToString(bytes[0], 16).ToUpper(), Convert.ToString(bytes[1], 16).ToUpper());
    }
    string str
    = strFormat + sb.ToString(0, sb.Length - 1) + "';";
    System.IO.File.WriteAllText(@
    "F:\encodeGb2312.js", str, Encoding.ASCII);

 

转载出处:

如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛

发表评论 (930人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
昵称:
最新评论
------分隔线----------------------------

快速入口

· 365软件
· 杰创官网
· 建站工具
· 网站大全

其它栏目

· 建站教程
· 365学习

业务咨询

· 技术支持
· 服务时间:9:00-18:00
365建站网二维码

Powered by 365建站网 RSS地图 HTML地图

copyright © 2013-2024 版权所有 鄂ICP备17013400号