JavaScript实现GB2312编码与解码的完整方案

作者:异步漫步

时间:2026-10-25

浏览:174

本文详细讲解在JavaScript中实现GB2312编码与解码的方法。针对原生encodeURI仅支持UTF-8的问题,文章对比了iframe、服务器中转及本地编码表三种方案,重点推荐并提供了基于预生成编码表的纯前端实现代码,包含完整的JS编码/解码函数及.NET生成编码表的辅助脚本。

文章目录
需求

JavaScript实现GB2312编码与解码的完整方案

在JavaScript中,若需将中文字符转换为GB2312编码格式,例如汉字“我”应被编码为“%CE%D2”。



分析

通常,JavaScript内置的encodeURI和encodeURIComponent函数默认使用UTF-8进行编码,例如“我”会被编码为“%E6%88%91”。经过实验验证,这些原生函数并未提供指定其他编码方式的参数选项,因此需要寻找替代方案。


大致分析有如下几种解决方案:

第一种方案是利用JavaScript动态创建一个隐藏的iframe,并将其编码设置为GB2312。将待转换的文本放入该iframe中form表单的一个input元素内,设置form提交方式为GET并提交表单。


随后,获取该表单提交后的URL并进行解析,从中提取出经过GB2312编码后的文本结果。


第二种方案是通过Ajax将文本发送到服务器端进行编码处理,待服务器返回编码结果后再传回前端。


第三种方案是在JavaScript客户端直接创建一个GB2312编码映射表,通过查表方式完成编码转换。



实现

对于第一种方案,作者认为实现过程较为繁琐,且需要在多种不同浏览器环境下进行兼容性测试,维护成本较高。


第二种方案依赖于服务器端的支持,增加了系统架构的复杂性。


以下是第三种方案的具体实现细节。


在实现初期,曾考虑使用数组来存储编码映射表,但为了减小JavaScript文件的体积,最终决定采用字符串形式存储编码表。


具体的JavaScript实现代码如下:



代码部分展示如下:


代码如下:

 
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);

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章