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 call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
Sep 28 Javascript
基于jquery的点击链接插入链接内容的代码
Jul 31 Javascript
javascript的创建多行字符串的7种方法
Apr 29 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
Jul 01 Javascript
javascript+canvas实现刮刮卡抽奖效果
Jul 29 Javascript
学习JavaScript设计模式(策略模式)
Nov 26 Javascript
使用jquery提交form表单并自定义action的方法
May 25 Javascript
使用DeviceOne实现微信小程序功能
Dec 29 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
Jan 13 Javascript
关于javascript获取内联样式与嵌入式样式的实例
Jun 01 Javascript
基于ionic实现下拉刷新功能
May 10 Javascript
react的滑动图片验证码组件的示例代码
Feb 27 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 zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
PHP如何抛出异常处理错误
2011/03/02 PHP
PHP中几个常用的魔术常量
2012/02/23 PHP
php&amp;mysql 日期操作小记
2012/02/27 PHP
php中in_array函数用法探究
2014/11/25 PHP
php查询mysql数据库并将结果保存到数组的方法
2015/03/18 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
jquery 实现的全选和反选
2009/04/15 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
2016/05/25 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
AngularJS实现controller控制器间共享数据的方法示例
2017/10/30 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
[02:33]2014DOTA2 TI每日综述 LGD涉险晋级DK闯入胜者组
2014/07/14 DOTA
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
python文件操作整理汇总
2014/10/21 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
Python中的延迟绑定原理详解
2019/10/11 Python
IronPython连接MySQL的方法步骤
2019/12/27 Python
Python extract及contains方法代码实例
2020/09/11 Python
HTML5通用接口详解
2016/06/12 HTML / CSS
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
Haggar官网:美国男装品牌
2020/02/16 全球购物
俄罗斯品牌服装和鞋子在线商店:BRIONITY
2020/03/26 全球购物
Ibatis如何调用存储过程
2015/05/15 面试题
直接有效的自我评价
2014/01/11 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
2014年工程师工作总结
2014/11/25 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
高中生社会实践心得体会
2016/01/14 职场文书
Python基于百度AI实现抓取表情包
2021/06/27 Python
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS
java实现web实时消息推送的七种方案
2022/07/23 Java/Android