js下用gb2312编码解码实现方法

 更新时间:2009年12月31日 23:26:15   作者:   我要评论
在js中将中文用gb2312编码。如,“我”编码后应该是“%CE%D2”。
需求
在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系列(34):设计模式之命令模式详解

    深入理解JavaScript系列(34):设计模式之命令模式详解

    这篇文章主要介绍了深入理解JavaScript系列(34):设计模式之命令模式详解,命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及执行可撤销的操作,需要的朋友可以参考下
    2015-03-03
  • js实现的简单图片浮动效果完整实例

    js实现的简单图片浮动效果完整实例

    这篇文章主要介绍了js实现的简单图片浮动效果,以完整实例形式分析了javascript实现图片定时漂浮移动功能的方法,涉及javascript定时函数与数值动态运算相关技巧,需要的朋友可以参考下
    2016-05-05
  • jQuery 的 ready()的纯js替代方法

    jQuery 的 ready()的纯js替代方法

    这篇文章主要介绍了jQuery 的 ready()的纯js替代方法的相关资料,需要的朋友可以参考下
    2016-11-11
  • ES2015 Symbol 一种绝不重复的值

    ES2015 Symbol 一种绝不重复的值

    这篇文章主要介绍了Symbol是ES2015新增的一种值类型数据,表示一种绝不重复的值,需要的朋友可以参考下
    2016-12-12
  • 深入浅析JavaScript中的作用域和上下文

    深入浅析JavaScript中的作用域和上下文

    javascript中的作用域(scope)和上下文(context)是这门语言的独到之处,这部分归功于他们带来的灵活性。本文给大家介绍JavaScript中的作用域和上下文,感兴趣的朋友一起学习
    2016-03-03
  • TypeScript 中接口详解

    TypeScript 中接口详解

    TypeScript核心设计原则之一就是类型检查,通过使用接口(Interfaces)可以进行类型检查,满足传统面向对象思想,利于有效开发,有效避免类型转换问题。
    2015-06-06
  • ES6中的迭代器、Generator函数及Generator函数的异步操作方法

    ES6中的迭代器、Generator函数及Generator函数的异步操作方法

    这篇文章主要介绍了ES6中的迭代器、Generator函数以及Generator函数的异步操作方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • 写js时遇到的一些小问题

    写js时遇到的一些小问题

    写js时遇到的一些小问题,需要的朋友可以参考下。
    2010-12-12
  • js简单实现网页换肤功能

    js简单实现网页换肤功能

    这篇文章主要为大家详细介绍了js简单实现网页换肤功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • JS点击缩略图整屏居中放大图片效果

    JS点击缩略图整屏居中放大图片效果

    今天开发的时候,遇到要点击缩略图之后居中显示图片的大图查看(大致效果如上图所示)~想了好几种实现方式,下面通过本文给大家分享JS点击缩略图整屏居中放大图片效果,需要的朋友参考下吧
    2017-07-07

最新评论