js下用gb2312编码解码实现方法


Posted in Javascript onDecember 31, 2009

需求
在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 相关文章推荐
JS中处理与当前时间间隔的函数代码
May 23 Javascript
JavaScript在网页中画圆的函数arc使用方法
Nov 13 Javascript
关于验证码在IE中不刷新的快速解决方法
Sep 23 Javascript
AngularJS实践之使用NgModelController进行数据绑定
Oct 08 Javascript
深入理解JS实现快速排序和去重
Oct 17 Javascript
深入学习jQuery中的data()
Dec 22 Javascript
JavaScript实现快速排序的方法分析
Jan 10 Javascript
修改node.js默认的npm安装目录实例
May 15 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
Sep 04 Javascript
聊聊Vue中provide/inject的应用详解
Nov 10 Javascript
Windows下安装 node 的版本控制工具 nvm
Feb 06 Javascript
vue自定义组件实现双向绑定
Jan 13 Vue.js
JavaScript 学习笔记(七)字符串的连接
Dec 31 #Javascript
JavaScript 学习笔记(六)
Dec 31 #Javascript
JavaScript 学习笔记(五)
Dec 31 #Javascript
JavaScript 学习笔记(四)
Dec 31 #Javascript
javascript showModalDialog模态对话框使用说明
Dec 31 #Javascript
javascript控制frame,iframe的src属性代码
Dec 31 #Javascript
让IE8支持DOM 2(不用框架!)
Dec 31 #Javascript
You might like
php获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2011/01/27 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
代码生成器 document.write()
2007/04/15 Javascript
基于jquery实现的表格分页实现代码
2011/06/21 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
2013/05/21 Javascript
Jquery中children与find之间的区别详细解析
2013/11/29 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
原生JavaScript编写canvas版的连连看游戏
2016/05/29 Javascript
jQuery实现的可编辑表格完整实例
2016/06/20 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
JS返回页面时自动回滚到历史浏览位置
2018/09/26 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
ES10的13个新特性示例(小结)
2019/09/23 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
详解template标签用法(含vue中的用法总结)
2021/01/12 Vue.js
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
粗略分析Python中的内存泄漏
2015/04/23 Python
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
python调用API实现智能回复机器人
2018/04/10 Python
Python+selenium 获取一组元素属性值的实例
2018/06/22 Python
python实战教程之自动扫雷
2018/07/13 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
财务经理岗位职责
2013/11/09 职场文书
函授毕业生自我鉴定范文
2014/03/25 职场文书
租房合同协议书
2014/04/09 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
员工保密协议书
2014/09/27 职场文书
未婚证明范本
2015/06/15 职场文书
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL
Python中可变和不可变对象的深入讲解
2021/08/02 Python