js下用gb2312编码解码实现方法_javascript技巧

需求
在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);

时间: 2024-08-08 04:23:38

js下用gb2312编码解码实现方法_javascript技巧的相关文章

动态创建script在IE中缓存js文件时导致编码的解决方法_javascript技巧

先看下重现代码 1, gb2312.html 该文件编码为gb2312 复制代码 代码如下: <!DOCTYPE html> <html> <head> <title></title> <meta charset="gb2312"/> <style> p { color: red; } </style> </head> <body> <button onclic

JS实现从网页顶部掉下弹出层效果的方法_javascript技巧

本文实例讲述了JS实现从网页顶部掉下弹出层效果的方法.分享给大家供大家参考.具体如下: 这里介绍的JavaScript动画背景出层,实现从网页顶部掉下来的感觉,停止时还带有缓冲弹跳的意思,从上到下显示的动画弹出层,带关闭功能,没有怎么美化,喜欢的用时候息动手美化下,觉得不错. 运行效果如下图所示: 具体代码如下: <HTML><HEAD><TITLE>窗口从上掉下来</TITLE> </HEAD> <BODY bgColor=#fef4d9

JS实现往下不断流动网页背景的方法_javascript技巧

本文实例讲述了JS实现往下不断流动网页背景的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <html> <head> <title>JS实现的往下不断流动的网页背景</title> </head> <body background="/images/bg002.jpg"> <script language="JavaScript"> <!-- Begin

通过javascript进行UTF-8编码的实现方法_javascript技巧

javascript的字符集: javascript程序是使用Unicode字符集编写的.Unicode是ASCII和Latin-1的超集,并支持地球上几乎所有的语言.ECMAScript3要求JavaScript必须支持Unicode2.1及后续版本,ECMAScript5则要求支持Unicode3及后续版本.所以,我们编写出来的 javascript程序,都是使用Unicode编码的. UTF-8 UTF-8(UTF8-bit Unicode Transformation Format)是一

js实现两点之间画线的方法_javascript技巧

本文实例讲述了js实现两点之间画线的方法.分享给大家供大家参考.具体分析如下: 最近有点无聊,琢磨了很久,想到了一消磨时间的点子,也就是做js版的连连看. 两点之间画线也只是连连看最基本功能的一部分,所以我画的线也仅是折线,而且还只能向左折,后面将根据连连看中图片位置点来确定折线的方向. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/

js实现iframe自动自适应高度的方法_javascript技巧

本文实例讲述了js实现iframe自动自适应高度的方法.分享给大家供大家参考.具体如下: 在编写网页的时候,很多时候要用到自动伸缩iframe高度 ,假如ifram中嵌入的是一个列表,那么增加数据后,刷新列表,iframe高度会自动伸长.删除数据后,iframe高度要自动缩短. 将下一段代码拷贝到iframe所在那个html或者jsp页面.在</html>标签后,调用此函数即可. <script type="text/javascript"> autoAdjus

JS中位置与大小的获取方法_javascript技巧

scrollHeight,clientHeight,offsetHeight的区别 说明: scrollHeight:DOM元素的实际内容的高度,不包border的高度,会随DOM元素中内容的增加(超过可视区后)而变大. clientHeight:DOM元素内容可视区的高度,不包含滚动条和边框的高度. offsetHeight:DOM元素整体的高度,包括滚动条和边框. 当滚动条不出现的时候 这时候DOM元素中没有内容或者内容不超过可视区 scrollWidth=clientWidth,两者皆为可

用XMLDOM和ADODB.Stream实现base64编码解码实现代码_javascript技巧

复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title> 用 XMLDOM 和 ADODB.Stream 实现base64编码解码 </title> <meta http-equiv="Content-Type" content="text/html; cha

js实现简单鼠标跟随效果的方法_javascript技巧

本文实例讲述了js实现简单鼠标跟随效果的方法.分享给大家供大家参考.具体分析如下: 鼠标跟随,顾名思义,就是在鼠标移动的时候,有个动画跟随着鼠标一起移动.   要点一: var oEvent = evt || window.event; 这个是为了兼容ie和ff而写的,在ie下window.event表示event对象,而ff下,是给事件函数传一个参数,这个参数就表示事件对象. 要点二: document.onmousemove = function(evt) 鼠标跟随是在鼠标移动时发生的事情.