需求

在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下载:

 

转载需注明出处: