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下申明对象的几种方法小结
Oct 02 Javascript
javascript 动态调整图片尺寸实现代码
Dec 28 Javascript
jQuery中创建实例与原型继承揭秘
Dec 21 Javascript
防止jQuery ajax Load使用缓存的方法小结
Feb 22 Javascript
jQuery制作拼图小游戏
Jan 12 Javascript
JavaScript性能优化之小知识总结
Nov 20 Javascript
Node.js的npm包管理器基础使用教程
May 26 Javascript
js插件dropload上拉下滑加载数据实例解析
Jul 27 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
Aug 06 Javascript
vue.js 微信支付前端代码分享
Feb 10 Javascript
微信小程序 组件的外部样式externalClasses使用详解
Sep 06 Javascript
javascript 内存模型实例详解
Apr 18 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如何解决网站大流量与高并发的问题
2011/06/25 PHP
php生成图片验证码的方法
2016/04/15 PHP
php查询内存信息操作示例
2019/05/09 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
基于mootools插件实现遮罩层新手引导
2012/05/24 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
基于jquery实现百度新闻导航菜单滑动动画
2016/03/15 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
bootstrap table小案例
2016/10/21 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
2016/12/30 Javascript
Mac下使用charles遇到的问题以及解决办法
2017/01/10 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
vue实现文件上传功能
2018/08/13 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
如何在 Vue 表单中处理图片
2021/01/26 Vue.js
python抽象基类用法实例分析
2015/06/04 Python
Python 数据结构之队列的实现
2017/01/22 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
Python 窗体(tkinter)按钮 位置实例
2019/06/13 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
2019/06/21 Python
python3用PIL把图片转换为RGB图片的实例
2019/07/04 Python
Python3爬虫中pyspider的安装步骤
2020/07/29 Python
Python实现手势识别
2020/10/21 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
文秘档案管理岗位职责
2014/03/06 职场文书
电工实训心得体会
2016/01/14 职场文书
2019个人半年工作总结
2019/06/21 职场文书
Mysql Online DDL的使用详解
2021/05/20 MySQL
Python如何导出导入所有依赖包详解
2021/06/08 Python