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 无符号右移赋值操作
Apr 17 Javascript
js判断一个元素是否为另一个元素的子元素的代码
Mar 21 Javascript
javascript实现iframe框架延时加载的方法
Oct 30 Javascript
javascript制作坦克大战全纪录(1)
Nov 27 Javascript
Javascript数组操作函数总结
Feb 05 Javascript
JavaScript实现的encode64加密算法实例分析
Apr 15 Javascript
终于实现了!精彩的jquery弹幕效果
Jul 18 Javascript
jquery删除数组中重复元素
Dec 05 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
Jan 13 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
Sep 27 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
Dec 10 Javascript
springboot+vue实现文件上传下载
Nov 17 Vue.js
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
盘点被央视点名过的日本动画电影 一部比一部强
2020/03/08 日漫
php压缩文件夹最新版
2018/07/18 PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
2020/09/13 PHP
jQuery使用手册之一
2007/03/24 Javascript
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
Javascript验证上传图片大小[前台处理]
2014/07/18 Javascript
js获取时间并实现字符串和时间戳之间的转换
2015/01/05 Javascript
JavaScript编程中容易出BUG的几点小知识
2015/01/31 Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
2015/03/03 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
Nodejs下DNS缓存问题浅析
2016/11/16 NodeJs
JS基于正则截取替换特定字符之间字符串操作示例
2017/02/03 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
vuejs实现递归树型菜单组件
2018/01/13 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
[50:38]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第二场 3月7日
2021/03/11 DOTA
基于Python 的进程管理工具supervisor使用指南
2016/09/18 Python
详解Python中类的定义与使用
2017/04/11 Python
Python3 socket同步通信简单示例
2017/06/07 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
Python爬虫防封ip的一些技巧
2020/08/06 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
多重CSS背景动画实现方法示例
2014/04/04 HTML / CSS
HTML5之SVG 2D入门7—SVG元素的重用与引用
2013/01/30 HTML / CSS
HTML5 Canvas绘制圆点虚线实例
2015/01/01 HTML / CSS
北京天润融通.net面试题笔试题
2012/02/20 面试题
AJAX都有哪些有点和缺点
2012/11/03 面试题
高级护理专业大学生求职信
2013/10/24 职场文书
《天游峰的扫路人》教学反思
2014/04/25 职场文书
教师群众路线学习心得体会
2014/11/04 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
高中语文教材(文学文化常识大全一)
2019/08/13 职场文书
python异步的ASGI与Fast Api实现
2021/07/16 Python