js中用gb2312编码解码

需求

在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);
复制代码

 

 最终js下载:encodeToGb2312.zip

posted @   朱才  阅读(17398)  评论(7编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示