当前位置: 首页 > 图文教程 > 网络编程 > Javascript > js下用gb2312编码解码实现方法

Javascript
javascript options属性集合操作代码
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
javascript 显示当前系统时间代码
firefox和IE系列的相关区别整理 以备后用
extJs 常用到的增,删,改,查操作代码
Javascript 面向对象特性
JavaScript的public、private和privileged模式
通过javascript设置css属性的代码
javascript iframe编程相关代码
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
js DOM模型操作
js 学习笔记(三)
用js做一个小游戏平台 (一)
jquery UI 1.72 之datepicker
jQuery的三种$()
JavaScript 常用函数
用javascript实现源代码的隐藏与解密的方法
javascript Onunload与Onbeforeunload使用小结
Javascript的闭包
JavaScript 对Cookie 操作的封装小结

Javascript 中的 js下用gb2312编码解码实现方法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-10   浏览: 36 ::
收藏到网摘: n/a

在js中将中文用gb2312编码。如,“我”编码后应该是“%CE%D2”。 需求
在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);