Rumah > hujung hadapan web > tutorial js > js下用gb2312编码解码实现方法

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

高洛峰
Lepaskan: 2017-02-04 09:46:42
asal
2189 orang telah melayarinya

需求 
在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 = &#39;&#39;; 
for (var i=0;i<str.length; i++){ 
var c = str.charAt(i); 
// +是空格 
if (c == &#39;+&#39;){ 
strOut += &#39; &#39;; 
} 
// a,b,c,1,2等,非%开头的,直接返回本身 
else if (c != &#39;%&#39;){ 
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=&#39;{0}&#39;;
Salin selepas log masuk

(这里没考虑中文标点,主要是看unicode里中文标点和日韩的标点混在一起,分布在几个地方,就懒得弄了。谁弄了可以发我一份,谢了。)
最后用.NET生成z处的代码:

代码

StringBuilder sb = new StringBuilder(); 
string strFormat = @"...z = &#39;"; // 前面的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) + "&#39;;"; 
System.IO.File.WriteAllText(@"F:\encodeGb2312.js", str, Encoding.ASCII);
Salin selepas log masuk

更多js下用gb2312编码解码实现方法相关文章请关注PHP中文网!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan