最新资讯当前位置:星鸿娱乐 > 最新资讯 > >

星鸿娱乐js下用gb2312编码解码实现方法

  

[js,gb2312,编码解码]js下用gb2312编码解码实现方法

  需求  
在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;ivar 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);  

(责任编辑:admin)

上一篇:bootstrap table 表格中增加下拉菜单末行出现滚动条

下一篇:AngularJS 如何在控制台进行错误调试

推荐内容

客户服务热线

010-400-12345

在线客服