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去掉字符串里的所有空格
Feb 08 Javascript
JavaScript replace(rgExp,fn)正则替换的用法
Mar 04 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
Nov 08 Javascript
Javascript中实现trim()函数的两种方法
Feb 04 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
Apr 07 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
Aug 06 Javascript
JQuery实现网页右侧随动广告特效
Jan 17 Javascript
JS作为值的函数用法示例
Jun 20 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
Jan 06 jQuery
详解SPA中前端路由基本原理与实现方式
Sep 12 Javascript
vue 实现用户登录方式的切换功能
Apr 14 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
Jul 07 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加密解密的代码
2006/10/09 PHP
PHP安全防范技巧分享
2011/11/03 PHP
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
php多次include后导致全局变量global失效的解决方法
2015/02/28 PHP
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
2013/05/17 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
2016/06/08 Javascript
Jquery和Js获得元素标签名称的方法总结
2016/10/08 Javascript
Angular4开发解决跨域问题详解
2017/08/28 Javascript
微信小程序云开发如何使用云函数生成二维码
2019/05/18 Javascript
用Python制作在地图上模拟瘟疫扩散的Gif图
2015/03/31 Python
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
python 日期操作类代码
2018/05/05 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
详解python while 函数及while和for的区别
2018/09/07 Python
Python中turtle库的使用实例
2019/09/09 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
python 实现简单的FTP程序
2019/12/27 Python
python实现简单飞行棋
2020/02/06 Python
Python单例模式的四种创建方式实例解析
2020/03/04 Python
解决Keras中CNN输入维度报错问题
2020/06/29 Python
旧时光糖果:Old Time Candy
2018/02/05 全球购物
有趣的流行文化T恤、马克杯、手机壳和更多:Look Human
2019/01/07 全球购物
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
学生党员思想汇报
2013/12/28 职场文书
优秀士兵个人事迹材料
2014/01/19 职场文书
小学生美德少年事迹
2014/02/02 职场文书
2014植树节活动总结
2014/03/11 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
团党委领导干部党的群众路线教育实践活动个人对照检查材料思想汇
2014/10/05 职场文书
毕业感言怎么写
2015/07/31 职场文书