最近在写一个关于文件上传(B/S结构)的组件时遇到这样一个问题:
我在服务器端获得某个参数的字节,然后转换为字符串,但是在编码上有些疑惑
我的问题是:
浏览器在遇到表单时,在提交请求时(post/get),将表单里的中文以什么编码放入输出流的?
我在服务器端用GBK生成字符串才是正确的结果,为什么不是ISO-8859-1?
我在服务器端获得某个参数的字节,然后转换为字符串,但是在编码上有些疑惑
我的问题是:
浏览器在遇到表单时,在提交请求时(post/get),将表单里的中文以什么编码放入输出流的?
我在服务器端用GBK生成字符串才是正确的结果,为什么不是ISO-8859-1?
的String(不是引用),如果沒有指定编码,那么这些String的编码是A的。另附:
(1)GBK编码
GBK编码是中国制订的、等同于UCS的新的中文编码扩展国家标准。GBK工作小组于1995年10月,同年12月完成GBK规范。该编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。
(2)UTF-8编码
UTF-8编码可以通过屏蔽位和移位操作快速读写。字符串比较时strcmp()和wcscmp()的返回结果相同,因此使排序变得更加容易。字节FF和FE在UTF-8编码中永远不会出现,因此他们可以用来表明UTF-16或UTF-32文本(见BOM) UTF-8 是字节顺序无关的。它的字节顺序在所有系统中都是一样的,因此它实际上并不需要BOM。
(3)GB2312
GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。
(4)iso-8859-1
iso-8859-1是JAVA网络传输使用的标准字符集,而gb2312是标准中文字符集,当你作出提交表单等需要网络传输的操作的时候,就需要把iso-8859-1转换为gb2312字符集显示,否则如果按浏览器的gb2312格式来解释iso-8859-1字符集的话,由于2者不兼容,所以会是乱码
比如get
Encoding myEncoding = Encoding.GetEncoding("gb2312");
string address = "http://www.baidu.com/s?" + HttpUtility.UrlEncode("参数一", myEncoding) + "=" + HttpUtility.UrlEncode("值一", myEncoding);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(address);
req.Method = "GET";post
Encoding myEncoding = Encoding.GetEncoding("gb2312");
string param = HttpUtility.UrlEncode("参数一", myEncoding) + "=" + HttpUtility.UrlEncode("值一", myEncoding) + "&" + HttpUtility.UrlEncode("参数二", myEncoding) + "=" + HttpUtility.UrlEncode("值二", myEncoding);byte[] postBytes = Encoding.ASCII.GetBytes(param);HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create( "http://www.baidu.com/s" );
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded;charset=gb2312";
req.ContentLength = postBytes.Length;这其中用到的gb2312也可以换成其它的,这里post用到了url解析,先使用 UrlEncode 方法将中文字符转换为编码后的 ASCII 码,然后提交到服务器,提交的时候可以说明编码的方式,用来使对方服务器能够正确的解析。我觉得是这样的,如果你要访问的那个页面不能够识别你的编码,而且它默认的编码方式与你提交的不符,就可能导致乱码现象