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 相关文章推荐
Prototype源码浅析 String部分(一)之有关indexOf优化
Jan 15 Javascript
jquery ready(fn)事件使用介绍
Aug 21 Javascript
js保留小数点后几位的写法
Jan 03 Javascript
javascript闭包入门示例
Apr 30 Javascript
js简单实现标签云效果实例
Aug 06 Javascript
Vue.js教程之axios与网络传输的学习实践
Apr 29 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
Aug 28 jQuery
JavaScript实现的文本框placeholder提示文字功能示例
Jul 25 Javascript
create-react-app安装出错问题解决方法
Sep 04 Javascript
详解webpack4之splitchunksPlugin代码包分拆
Dec 04 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
Jul 20 Javascript
JavaScript中的宏任务和微任务详情
Nov 27 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
Yii2分页的使用及其扩展方法详解
2016/05/23 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
利用PHP计算有多少小于当前数字的数字方法示例
2020/08/26 PHP
点击广告后才能获得下载地址
2006/10/26 Javascript
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
关于递归运算的顺序测试代码
2011/11/30 Javascript
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
2015/02/15 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
2016/08/24 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
一步步教会你微信小程序的登录鉴权
2018/04/09 Javascript
Vue前后端不同端口的实现方法
2018/09/19 Javascript
最简单的vue消息提示全局组件的方法
2019/06/16 Javascript
uni-app如何页面传参数的几种方法总结
2020/04/28 Javascript
在Echarts图中给坐标轴加一个标识线markLine
2020/07/20 Javascript
python笔记(2)
2012/10/24 Python
Django中实现点击图片链接强制直接下载的方法
2015/05/14 Python
在Django的View中使用asyncio的方法
2019/07/12 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
2019/11/28 Python
如何用 Python 处理不平衡数据集
2021/01/04 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
会计学自我鉴定
2014/02/06 职场文书
党校个人自我鉴定范文
2014/03/28 职场文书
学习雷锋活动总结
2014/04/29 职场文书
国际金融专业自荐信
2014/07/05 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
合作协议书模板
2014/10/10 职场文书
英语教师个人工作总结
2015/02/09 职场文书
干部外出学习心得体会
2016/01/18 职场文书
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android
Java中API的使用方法详情
2022/04/06 Java/Android
Golang ort 中的sortInts 方法
2022/04/24 Golang