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与CSS复习(《精通javascript》)
Jun 29 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
May 05 Javascript
深入理解javascript作用域和闭包
Sep 23 Javascript
JavaScript简单下拉菜单实例代码
Sep 07 Javascript
jquery常用的12个小功能
Jul 22 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
Sep 23 Javascript
jQuery插件版本冲突的处理方法分析
Jan 16 Javascript
JavaScript转换数据库DateTime字段类型方法
Jun 27 Javascript
vue 2.0项目中如何引入element-ui详解
Sep 06 Javascript
vue初尝试--项目结构(推荐)
Jan 30 Javascript
详解Eslint 配置及规则说明
Sep 10 Javascript
小程序实现锚点滑动效果
Sep 23 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
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
2007/01/29 PHP
PHP 金额数字转换成英文
2010/05/06 PHP
PHP中对用户身份认证实现两种方法
2011/06/04 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
2014/07/22 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
PHP中的类型提示(type hinting)功能介绍
2015/07/01 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
js切换div css注意的细节
2012/12/10 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
javascript制作网页图片上实现下雨效果
2015/02/26 Javascript
JavaScript每天必学之基础知识
2016/09/17 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
Openlayers实现点闪烁扩散效果
2020/09/24 Javascript
vue实现拖拽进度条
2021/03/01 Vue.js
[02:10]2018DOTA2亚洲邀请赛赛前采访-Liquid
2018/04/03 DOTA
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
用Python设计一个经典小游戏
2017/05/15 Python
使用Kivy将python程序打包为apk文件
2017/07/29 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
2019/05/07 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
python中xlrd模块的使用详解
2021/02/01 Python
详解CSS3阴影 box-shadow的使用和技巧总结
2016/12/03 HTML / CSS
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
幼儿园教研活动总结
2014/04/30 职场文书
卖房协议书样本
2014/10/30 职场文书
致运动员加油稿
2015/07/21 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书
js实现上传图片到服务器
2021/04/11 Javascript
交互式可视化js库gojs使用介绍及技巧
2022/02/18 Javascript