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 相关文章推荐
js用Date对象处理时间实现思路及代码
Jan 31 Javascript
jquery入门——事件机制之事件中的冒泡现象示例解释
Sep 12 Javascript
node.js中的http.response.writeHead方法使用说明
Dec 14 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
Jan 27 Javascript
使用Bootstrap框架制作查询页面的界面实例代码
May 27 Javascript
使用jQuery操作DOM的方法小结
Feb 27 Javascript
jQuery中table数据的值拷贝和拆分
Mar 19 Javascript
vue监听scroll的坑的解决方法
Sep 07 Javascript
vue-cli 引入jQuery,Bootstrap,popper的方法
Sep 03 jQuery
详解Vue源码之数据的代理访问
Dec 11 Javascript
如何解决vue在ios微信&quot;复制链接&quot;功能问题
Mar 26 Javascript
在vue中import()语法不能传入变量的问题及解决
Apr 01 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
详谈PHP文件目录基础操作
2014/11/11 PHP
javascript 动态添加事件代码
2008/11/30 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
JS远程获取网页源代码实例
2013/09/05 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
最常见和最有用的字符串相关的方法详解
2017/02/06 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
jQuery实现简单的Ajax调用功能示例
2019/02/15 jQuery
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
2019/04/14 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
Python重新引入被覆盖的自带function
2014/07/16 Python
Python常见MongoDB数据库操作实例总结
2018/07/24 Python
利用Python实现原创工具的Logo与Help
2018/12/03 Python
python实现播放音频和录音功能示例代码
2018/12/30 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
2019/05/04 Python
python射线法判断检测点是否位于区域外接矩形内
2019/06/28 Python
django最快程序开发流程详解
2019/07/19 Python
python错误调试及单元文档测试过程解析
2019/12/19 Python
Python读写操作csv和excle文件代码实例
2020/03/16 Python
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
编辑求职信样本
2013/12/16 职场文书
大型车展策划方案
2014/02/01 职场文书
财务会计大学生自我评价
2014/04/09 职场文书
大学开学计划书
2014/04/30 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
2016中秋节广告语
2016/01/28 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书
Nginx配置之实现多台服务器负载均衡
2021/08/02 Servers
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技
MySQL中order by的执行过程
2022/06/05 MySQL
volatile保证可见性及重排序方法
2022/08/05 Java/Android