zoukankan
html css js c++ java
Asp.Net 编码和解码
最近因为项目需要,做了一个投票的页面
(Html
,比如
A
页面
)
,要把它
Post
到一个
Aspx
页面(比如
B
页面),在这个
Aspx
页面上,需要确认一下,在提交到数据库,可是问题出来了,用户在
A
页面上点击
Submit
,
Post
到
B
页面上的时候,在
B
页面用
Request.Form[
“
ID
”
],
接收,但是显示时,有时候是乱码,有的时候却是正常的,不知道为什么,在网上查了一些资料,看了一些编码的文章,感觉出现问题的原因是这样的,
A
页面虽然在开始有一句
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
,但是用户用的机器上的编码可能是
UTF
或者
GB
的,在用户
Post
的时候,是用用户自己上的编码格式编的码(我的理解),从而在
Request
的时候就已经成乱码了。一开始,我想两种办法,一种是用
Url
编码,比如我们在
A
页面上有一个
Input : <input type="radio" id="IsRightSee_2" name="radiobuttonIsRightSee" value="
音、视频播放不连续
" />
音、视频播放不连续
,
我们把它的
Value
用
Url
编码
,
变成
<input type="radio" id="IsRightSee_2" name="radiobuttonIsRightSee" value="%e%d..
之类的
" />
音、视频播放不连续,在
B
页面用
Request[“radiobuttonIsRightSee”],
得到
Value,
然后再对这个
Value
解码,可是出乎我的意料的是,用这个办法得到的也是乱码。碰壁后只有用第二种方案,就是用
Unicode对其编码
,
因为原先我没有遇到编码解码问题,所以就在网上搜索资源,但是与其相关的都没有一个好的解决方案,只搜到一个汉字转
Unicode
的工具,把其下载下来,先做了一个测试,对上文中的
”
音、视频播放不连续
”,
进行编码,得到“
\u
97F
3\u3001\u
89C
6\u9891\u64AD\u653E\u4E0D\u8FDE\u7EED
”,然后再
B
页面上在对这个
Value
解码,果然,没有成乱码,看到这得你会不会想到,我怎么对这一串进行解码的,这个工具又没有源代码,其实这个工具是用
.Net
写的,
.Net
写的我们就有办法看里边的源代码了,只要他没有对源代码加密,用
Reflector就行。
解码的源代码如下:
private
string
NormalU2C(
string
input)
{
string
str
=
""
;
char
[] chArray
=
input.ToCharArray();
Encoding bigEndianUnicode
=
Encoding.BigEndianUnicode;
for
(
int
i
=
0
; i
<
chArray.Length; i
++
)
{
char
ch
=
chArray[i];
if
(ch.Equals(
'
\\
'
))
{
i
++
;
i
++
;
char
[] chArray2
=
new
char
[
4
];
int
index
=
0
;
index
=
0
;
while
((index
<
4
)
&&
(i
<
chArray.Length))
{
chArray2[index]
=
chArray[i];
index
++
;
i
++
;
}
if
(index
==
4
)
{
try
{
str
=
str
+
this
.UnicodeCode2Str(chArray2);
}
catch
(Exception)
{
str
=
str
+
@"
\u
"
;
for
(
int
j
=
0
; j
<
index; j
++
)
{
str
=
str
+
chArray2[j];
}
}
i
--
;
}
else
{
str
=
str
+
@"
\u
"
;
for
(
int
k
=
0
; k
<
index; k
++
)
{
str
=
str
+
chArray2[k];
}
}
}
else
{
str
=
str
+
ch.ToString();
}
}
return
str;
}
private
string
UnicodeCode2Str(
char
[] u4)
{
if
(u4.Length
<
4
)
{
throw
new
Exception(
"
It's not a unicode code array
"
);
}
string
str
=
"
0123456789ABCDEF
"
;
char
ch
=
char
.ToUpper(u4[
0
]);
char
ch2
=
char
.ToUpper(u4[
1
]);
char
ch3
=
char
.ToUpper(u4[
2
]);
char
ch4
=
char
.ToUpper(u4[
3
]);
int
index
=
str.IndexOf(ch);
int
num2
=
str.IndexOf(ch2);
int
num3
=
str.IndexOf(ch3);
int
num4
=
str.IndexOf(ch4);
if
(((index
==
-
1
)
||
(num2
==
-
1
))
||
((num3
==
-
1
)
||
(num4
==
-
1
)))
{
throw
new
Exception(
"
It's not a unicode code array
"
);
}
byte
num5
=
(
byte
)(((index
*
0x10
)
+
num2)
&
0xff
);
byte
num6
=
(
byte
)(((num3
*
0x10
)
+
num4)
&
0xff
);
byte
[] bytes
=
new
byte
[]
{ num5, num6 }
;
return
Encoding.BigEndianUnicode.GetString(bytes);
}
写到这里问题基本上解决了,可是如果您的页面上有n多的input ,你还用这个工具一个input,一个input,把其中的Value
Copy –Convert-Parse,到你的页面上吗?
其实我们可以写一个正则表达式,用正则表达式来找出
input
中的
Value,
然后编码之后,在把原先的
Value
替换成编码后的
Value,这样的话,即省了功夫,又不会出错(除非你的正则有问题),
如果你不清楚怎么写的话,见一下代码:
protected
void
Button1_Click(
object
sender, EventArgs e)
{
string
strPatter
=
@"
(<input\s*[^>]*value\s*=\s*"")([^""]*)("".*?/>)
"
;
//txtcontent为需要替换的
//txtresult为结果
Regex rgx
=
new
Regex(strPatter, RegexOptions.Multiline);
this
.txtresult.Text
=
rgx.Replace(txtcontent.Text,
new
MatchEvaluator(Encode));
}
//
调用委托
private
string
Encode(Match m)
{
string
strValue1
=
m.Groups[
1
].Value;
string
strValue2
=
m.Groups[
2
].Value;
string
strValue3
=
m.Groups[
3
].Value;
return
strValue1
+
EncodeUniCode(strValue2)
+
strValue3;
}
//
对中文编码成Unicode
private
string
EncodeUniCode(
string
input)
{
Encoding bigEndianUnicode
=
Encoding.BigEndianUnicode;
char
[] chArray
=
input.ToCharArray();
string
str
=
""
;
foreach
(
char
ch
in
chArray)
{
if
(ch.Equals(
'
\r
'
)
||
ch.Equals(
'
\n
'
))
{
str
=
str
+
ch;
}
else
{
byte
[] bytes
=
bigEndianUnicode.GetBytes(
new
char
[]
{ ch }
);
str
=
(str
+
@"
\u
"
)
+
string
.Format(
"
{0:X2}
"
, bytes[
0
])
+
string
.Format(
"
{0:X2}
"
, bytes[
1
]);
}
}
return
str;
}
编码工具下载
查看全文
相关阅读:
Oracle11gR2导入导出实战之物化视图prebuilt
Oracle11gr2_ADG管理之switchover补充
Oracle11gR2--手工建库&dbca建库
Oracle11gr2_ADG管理之在备库上模拟failover的过程实战
自己写个验证码类
隐藏字符 BOM
jquery与自己写的js文件冲突解决办法
javaBean
序列化
UML
原文地址:https://www.cnblogs.com/xbf321/p/asp_net_char_convert_to_unicode.html
最新文章
web响应式图片设计实现
JavaScript定时器原理分析
基于Bootstrap仿淘宝分页控件实现
fiddler手机抓包教程
自己动手写插件底层篇—基于jquery移动插件实现
前端跨域的那些事
JavaScript事件流原理解析
CSS3-3D制作案例分析实战
前端数据可视化echarts.js使用指南
CSS3系列之3D制作
热门文章
为什么目前没有"成熟"的cookie插件?
cookie学习指南
web前端开发最佳实践笔记
2016年6月前端工作笔记
localStorage使用总结
MySQL修改redo_log_size
Oracle表结构转Mysql表结构
Oracle11gR2-聚簇因子浅析
SqlServer数据压缩测试
更改AD域安全策略-密码必须符合复杂性要求
Copyright © 2011-2022 走看看