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实现计算两个日期的间隔天数
Aug 14 Javascript
关于取不到由location.href提交而来的上级页面地址的解决办法
Jul 30 Javascript
8款非常棒的响应式jQuery 幻灯片插件推荐
Feb 02 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
May 23 Javascript
javascript 终止函数执行操作
Feb 14 Javascript
让JavaScript中setTimeout支持链式操作的方法
Jun 19 Javascript
简介alert()与console.log()的不同
Aug 26 Javascript
AngularJS中的Directive实现延迟加载
Jan 25 Javascript
基于jQuery实现音乐播放试听列表
Apr 14 Javascript
jquery的checkbox,radio,select等方法小结
Aug 30 Javascript
vue监听键盘事件的快捷方法【推荐】
Jul 11 Javascript
layui table 多行删除(id获取)的方法
Sep 12 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
PHILIPS AE3805收音机的分析打磨
2021/03/02 无线电
php实现将HTML页面转换成word并且保存的方法
2016/10/14 PHP
javascript 触发事件列表 比较不错
2009/09/03 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
基于JQuery 选择器使用说明介绍
2013/04/18 Javascript
15条JavaScript最佳实践小结
2013/08/09 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
2014/07/29 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
2015/02/27 Javascript
非常实用的12个jquery代码片段
2015/11/02 Javascript
多种jQuery绑定事件的实现方式
2016/06/13 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
vue2.0使用swiper组件实现轮播的示例代码
2018/03/03 Javascript
详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
2018/07/24 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
2019/03/27 Javascript
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
python使用json序列化datetime类型实例解析
2018/02/11 Python
python字符串与url编码的转换实例
2018/05/10 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
python matplotlib如何给图中的点加标签
2019/11/14 Python
Python 私有属性和私有方法应用场景分析
2020/06/19 Python
python程序如何进行保存
2020/07/03 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
一道写SQL的面试题和答案
2013/11/19 面试题
大学生党员自我批评
2014/02/14 职场文书
租房协议书范本
2014/04/09 职场文书
养成教育经验材料
2014/05/26 职场文书
教师党的群众路线学习心得体会
2014/11/04 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL
解决redis批量删除key值的问题
2022/03/23 Redis