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 相关文章推荐
JavaScript 判断日期格式是否正确的实现代码
Jul 04 Javascript
js监听输入框值的即时变化onpropertychange、oninput
Jul 13 Javascript
imgAreaSelect 中文文档帮助说明
Oct 08 Javascript
js 幻灯片的实现
Dec 06 Javascript
学习JavaScript设计模式之责任链模式
Jan 18 Javascript
jQuery实现的导航下拉菜单效果
Jul 04 Javascript
jQuery验证表单格式的使用方法
Jan 10 Javascript
Vue.js组件tab实现选项卡切换
Mar 23 Javascript
详谈JS中数组的迭代方法和归并方法
Aug 11 Javascript
JS沙箱模式实例分析
Sep 04 Javascript
uni app仿微信顶部导航条功能
Sep 17 Javascript
原生js+ajax分页组件
Jan 30 Javascript
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猴子选大王问题解决方法
2015/05/12 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
基于Laravel5.4实现多字段登录功能方法示例
2017/08/11 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
JavaScript将Table导出到Excel实现思路及代码
2013/03/13 Javascript
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
nodejs URL模块操作URL相关方法介绍
2015/03/03 NodeJs
使用AngularJS中的SCE来防止XSS攻击的方法
2015/06/18 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
2015/11/15 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
手机图片预览插件photoswipe.js使用总结
2016/08/25 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
2017/04/21 jQuery
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
vue slot 在子组件中显示父组件传递的模板
2018/03/02 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
2018/03/07 Javascript
vue axios 简单封装以及思考
2018/10/09 Javascript
js Array.slice的8种不同用法示例
2019/07/10 Javascript
vue动态渲染svg、添加点击事件的实现
2020/03/13 Javascript
python基础教程之Filter使用方法
2017/01/17 Python
tensorflow更改变量的值实例
2018/07/30 Python
python函数的作用域及关键字详解
2019/08/20 Python
django-rest-swagger对API接口注释的方法
2019/08/29 Python
python中栈的原理及实现方法示例
2019/11/27 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
Python结合百度语音识别实现实时翻译软件的实现
2021/01/18 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
教师批评与自我批评
2014/10/15 职场文书
2016年校园重阳节广播稿
2015/12/18 职场文书
golang 在windows中设置环境变量的操作
2021/04/29 Golang