最近在写一个关于文件上传(B/S结构)的组件时遇到这样一个问题:
    我在服务器端获得某个参数的字节,然后转换为字符串,但是在编码上有些疑惑
 我的问题是:
    浏览器在遇到表单时,在提交请求时(post/get),将表单里的中文以什么编码放入输出流的?
    我在服务器端用GBK生成字符串才是正确的结果,为什么不是ISO-8859-1?
    

解决方案 »

  1.   

    ISO8859-1字符集只包含英文字符,使用一个字节存储。GB2312、GBK和GB18030字符集包含中文字符,他们都兼容ISO8859-1字符集,而1个汉字是用2个字节存储的
      

  2.   

    乱码问题的产生最根本的原因就是使用错误的字符集解码字节流或者将给定的字符串用错误的字符集编码成错误字节流造成的,例如”中文”两个汉字,如果用ISO8859-1字符集将其编码为字节流,因为这个字符集不支持中文,所以就会出错,输出结果为3f3f,其意义就是??。再例如”中文”二字的GBK的字节流为d6 d0 ce c4,可是我们要是用不兼容的字符集去解码,例如用ISO8859-1或者UTF-8,这随后产生的字符串就是乱码,或者是其他的某个字符。
      

  3.   

    在jsp中<%@ page contentType="text/html; charset=A" %>如果指定了,那么在改jsp中所有构造
    的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者不兼容,所以会是乱码
      

  4.   

    这个是可以指定的
    比如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 码,然后提交到服务器,提交的时候可以说明编码的方式,用来使对方服务器能够正确的解析。我觉得是这样的,如果你要访问的那个页面不能够识别你的编码,而且它默认的编码方式与你提交的不符,就可能导致乱码现象