ASPNET的乱码
1 编码的知识
ASCII:只支持英文."123"=对应的编码:31 32 33
ANSI: 每个国家都有自己的编码,例如:GB2312,JIS . "中文123"=D6D0 CEC4 31 32 33
UNICODE:把世界所有的语言用一种编码表示. "中文123"=2D4E 8765 3100 3200 3300
2 乱码产生的原因
1)非Unicode程序之间的移植
2)网页提交的字符串 ,"中" 提交 "%D6%D0"
3)从数据库提取
4) 电子邮件中
主要的原则就是机器之间使用不同编码格式,可以在页面设置编码格式,也可以在配置文件里面设置全局的编码格式
3 测试编码的长度
//str="中文123"
private void TestLength(string str)
{
Console.WriteLine(str.Length);//结果为5
//字符串和字节串之间的转换
Encoding gb=Encoding.GetEncoding("gb2312");
char[] chars=gb.GetBytes(str);//从字节得到GB2312字符数组
byte[] bytes=gb.GetBytes(str);
str=gb.GetString(bytes);//从字节得到UNICODE字符串
Console.WriteLine(chars);//结果为7
Console.WriteLine(str);//结果为9
}
4 模拟B/S乱码
//str="中文123",默认的格式为UNICODE
private void LM(string str)
{
Encoding client = Encoding.GetEncoding("gb2312");
byte[] bytes=client.GetBytes(str);
//正确
Encoding serverok=Encoding.GetEncoding("gb2312");
string strserver=serverok.GetString(bytes);
Console.WriteLine(strserver);
//错误
strserver=Encoding.Unicode.GetString(bytes);
Console.WriteLine(strserver);
}
5 编码之间的转换
private string UTFtoGB2312(string utfinfo)
{
Encoding utf8=Encoding.UTF8;
Encoding gb2312=Encoding.GetEncoding("gb2312");
byte[] unicodebytes=utf8.GetBytes(utfinfo);
byte[] asciibytes=Encoding.Convert(utf8,gb2312,unicodebytes);
byte[] as asciichars=new char(gb2312.GetCharCount(asciibytes,0,acciibytes.Length));
gb2312.GetChars(asciibytes,0,asciibytes.Length,asciichars,0);
string gb2312info=new string(asciichars);
return gb2312info;
}
6 产生随机汉字
priavte void GetHZRad()
{
Encoding gb2312=Encoding.GetEncoding("gb2312");//获得gb2312编码表
//调用函数产生2个随机中文汉字的编码
object[] bytes=CreateRegionCode(2);
//更具汉字编码的字节数组解码出汉字
string str1=gb2312.GetString((byte[])Convert.ChangeType(bytes[0],typeof(byte[])));
string str2=gb2312.GetString((byte[])Convert.ChangeType(bytes[1],typeof(byte[])));
string strkey=str1+str2;
byte[] data=gb2312.GetBytes(strkey);
Response.ContentEncoding=gb2312;//设置返回的格式
Response.OutputStream.Write(data,0,data.Length);
}
1 编码的知识
ASCII:只支持英文."123"=对应的编码:31 32 33
ANSI: 每个国家都有自己的编码,例如:GB2312,JIS . "中文123"=D6D0 CEC4 31 32 33
UNICODE:把世界所有的语言用一种编码表示. "中文123"=2D4E 8765 3100 3200 3300
2 乱码产生的原因
1)非Unicode程序之间的移植
2)网页提交的字符串 ,"中" 提交 "%D6%D0"
3)从数据库提取
4) 电子邮件中
主要的原则就是机器之间使用不同编码格式,可以在页面设置编码格式,也可以在配置文件里面设置全局的编码格式
3 测试编码的长度
//str="中文123"
private void TestLength(string str)
{
Console.WriteLine(str.Length);//结果为5
//字符串和字节串之间的转换
Encoding gb=Encoding.GetEncoding("gb2312");
char[] chars=gb.GetBytes(str);//从字节得到GB2312字符数组
byte[] bytes=gb.GetBytes(str);
str=gb.GetString(bytes);//从字节得到UNICODE字符串
Console.WriteLine(chars);//结果为7
Console.WriteLine(str);//结果为9
}
4 模拟B/S乱码
//str="中文123",默认的格式为UNICODE
private void LM(string str)
{
Encoding client = Encoding.GetEncoding("gb2312");
byte[] bytes=client.GetBytes(str);
//正确
Encoding serverok=Encoding.GetEncoding("gb2312");
string strserver=serverok.GetString(bytes);
Console.WriteLine(strserver);
//错误
strserver=Encoding.Unicode.GetString(bytes);
Console.WriteLine(strserver);
}
5 编码之间的转换
private string UTFtoGB2312(string utfinfo)
{
Encoding utf8=Encoding.UTF8;
Encoding gb2312=Encoding.GetEncoding("gb2312");
byte[] unicodebytes=utf8.GetBytes(utfinfo);
byte[] asciibytes=Encoding.Convert(utf8,gb2312,unicodebytes);
byte[] as asciichars=new char(gb2312.GetCharCount(asciibytes,0,acciibytes.Length));
gb2312.GetChars(asciibytes,0,asciibytes.Length,asciichars,0);
string gb2312info=new string(asciichars);
return gb2312info;
}
6 产生随机汉字
priavte void GetHZRad()
{
Encoding gb2312=Encoding.GetEncoding("gb2312");//获得gb2312编码表
//调用函数产生2个随机中文汉字的编码
object[] bytes=CreateRegionCode(2);
//更具汉字编码的字节数组解码出汉字
string str1=gb2312.GetString((byte[])Convert.ChangeType(bytes[0],typeof(byte[])));
string str2=gb2312.GetString((byte[])Convert.ChangeType(bytes[1],typeof(byte[])));
string strkey=str1+str2;
byte[] data=gb2312.GetBytes(strkey);
Response.ContentEncoding=gb2312;//设置返回的格式
Response.OutputStream.Write(data,0,data.Length);
}