js下用gb2312编码解码实现方法
js下用gb2312编码解码实现方法
发布时间:2016-12-30 来源:查字典编辑
摘要:需求在js中将中文用gb2312编码。如,“我”编码后应该是“%CE%D2”。分析大家知道,encodeURI和encodeURICompo...

需求

在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代码如下:

代码

复制代码 代码如下:

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处的代码:

代码

复制代码 代码如下:

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);

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新Javascript教程学习
热门Javascript教程学习
编程开发子分类