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获取父节点方法
Aug 20 Javascript
JS获取页面窗口大小的代码解读
Dec 01 Javascript
js的2种继承方式详解
Mar 04 Javascript
JavaScript在网页中画圆的函数arc使用方法
Nov 13 Javascript
JS原型、原型链深入理解
Feb 27 Javascript
JavaScript获取URL参数的方法之一
Mar 24 Javascript
简单谈谈关于Angular Cli打包的事
Sep 05 Javascript
浅谈在node.js进入文件目录的问题
May 13 Javascript
js防抖和节流的深入讲解
Dec 06 Javascript
JavaScript中的null和undefined用法解析
Sep 30 Javascript
微信小程序利用button控制条件标签的变量问题
Mar 15 Javascript
Vue3中的Refs和Ref详情
Nov 11 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学习之function的用法
2012/07/14 PHP
php程序总是提示验证码输入有误解决方案
2015/01/07 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
JS input 数字验证代码
2009/07/30 Javascript
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
2015/08/13 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
2016/08/15 Javascript
React中的refs的使用教程
2018/02/13 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
JavaScript动态创建二维数组的方法示例
2019/02/01 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
[04:21]狐狸妈带你到现场 DOTA2 TI中国区预选赛线下赛路线指引
2014/05/22 DOTA
Python中正则表达式的用法实例汇总
2014/08/18 Python
Python获取CPU、内存使用率以及网络使用状态代码
2018/02/08 Python
Django学习笔记之ORM基础教程
2018/03/27 Python
python简易远程控制单线程版
2018/06/20 Python
python使用正则筛选信用卡
2019/01/27 Python
python+opencv实现车牌定位功能(实例代码)
2019/12/24 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
python list的index()和find()的实现
2020/11/16 Python
浅谈HTML5新增和废弃的标签
2019/04/28 HTML / CSS
远东集团网络工程师面试题
2014/10/20 面试题
写给学生的新学期寄语
2014/01/18 职场文书
心理健康活动总结
2014/04/30 职场文书
2014年母亲节演讲稿范文
2014/05/07 职场文书
安全宣传标语口号
2014/06/06 职场文书
大学生个人求职信例文
2014/07/07 职场文书
windows10声卡驱动怎么安装?win10声卡驱动安装操作步骤教程
2022/08/05 数码科技