写了一个http服务器,想加深对协议的理解。我使用  InputStream is = new DataInputStream(new
                                    BufferedInputStream(client.getInputStream()));
然后使用is来都流(故意没有使用reader一类的io类)。读到字节数组buf后,想把它转换成汉字。因为我在ie的form元素里输入的是汉字,但是视了: str = new String(buf2,"gb2312");
str = new String(buf2,"iso8859-1");以及str = new String(buf2);都不行。ie浏览器在发送信息时候,会把所输入的字符串都按iso8859-1转换成字节流(还是字符串)。这个中间的细节我不懂,
请大家告诉我其中的道理,要怎么转换。
关于编码方式,字符串,字节流之间的关系,转换方式,希望大家指导指导

解决方案 »

  1.   

    request.setCharacterEncoding("GBK");DataInputStream.readUTF();
      

  2.   

    我是自己随便写了个socket服务断,来读取浏览器发过来的信息,呵呵,request.setCharacterEncoding("GBK");当然于我没有用了,
    DataInputStream.readUTF();
    我试一试
      

  3.   

    readUTF()和我先读取到字节流,然后new String(buf)有什么区别吗?new String(buf)默认得就是utf编码方式吧,因为java平台默认得就是这个,各位,是这样得吗?
      

  4.   

    IE 发送过来的 form 数据中的汉字,不管各位怎么转化都是出不来的,因为:1. 采用的编码根发送页面的编码有关,并不一定都是 utf-8
    2. 发送时,除了按照编码转化成字节串外,还要通过 URLEncode 编码,也就是 %XX 的格式
    因此,搂主需要首先 URLDecode 以后,再用与提交页面相同的编码将字节流恢复成字符串才能看到汉字。
      

  5.   

    但是,post方法发送的东东应该是没有经过URLEncode 编码的,是吗?
    发送时候的编码不会根据页面的编码来确定吧,应该是统一编码方式吧。页面编码中指定的charset="gb2312"等东东,应该是告诉浏览器怎样解析服务端发过来的东东吧。
    呵呵,我是没什么映象了,请大家来把问题确认一下
      

  6.   

    jerrya12() 兄,你记错了。我说的 2 点都没有错的:编码是按照页面提交的编码;并且 POST 的数据也是要经过 URLEncode 的。我曾经用 VC 写过 cgi 程序,这些细节我以前遇到过。刚才我又做了一次测试,观察了一下抓取的数据包,的确是这样的。这是我抓取的包:(提交的内容为:“你好123”,发送过去的数据为:%C4%E3%BA%C3123):0x0000   00 60 E0 03 18 9D 00 01-03 19 44 1A 08 00 45 00   .`?.?...D...E.
    0x0010   01 F6 22 77 40 00 80 06-BC 37 D5 D5 D5 22 26 76   .?w@.€.?照?&v
    0x0020   48 E5 0E 69 00 50 F9 EC-E3 B6 90 A8 F4 DB 50 18   H?i.P愣惃糅P.
    0x0030   3D 46 1C 3C 00 00 50 4F-53 54 20 2F 73 73 77 61   =F.<..POST /sswa
    0x0040   74 65 72 2F 74 65 73 74-2E 61 73 70 20 48 54 54   ter/test.asp HTT
    0x0050   50 2F 31 2E 31 0D 0A 41-63 63 65 70 74 3A 20 2A   P/1.1..Accept: *
    0x0060   2F 2A 0D 0A 52 65 66 65-72 65 72 3A 20 68 74 74   /*..Referer: htt
    0x0070   70 3A 2F 2F 77 77 77 32-39 2E 77 65 62 73 61 6D   p://www29.websam
    0x0080   62 61 2E 63 6F 6D 2F 73-73 77 61 74 65 72 2F 74   ba.com/sswater/t
    0x0090   65 73 74 2E 61 73 70 0D-0A 41 63 63 65 70 74 2D   est.asp..Accept-
    0x00A0   4C 61 6E 67 75 61 67 65-3A 20 7A 68 2D 63 6E 0D   Language: zh-cn.
    0x00B0   0A 43 6F 6E 74 65 6E 74-2D 54 79 70 65 3A 20 61   .Content-Type: a
    0x00C0   70 70 6C 69 63 61 74 69-6F 6E 2F 78 2D 77 77 77   pplication/x-www
    0x00D0   2D 66 6F 72 6D 2D 75 72-6C 65 6E 63 6F 64 65 64   -form-urlencoded
    0x00E0   0D 0A 41 63 63 65 70 74-2D 45 6E 63 6F 64 69 6E   ..Accept-Encodin
    0x00F0   67 3A 20 67 7A 69 70 2C-20 64 65 66 6C 61 74 65   g: gzip, deflate
    0x0100   0D 0A 55 73 65 72 2D 41-67 65 6E 74 3A 20 4D 6F   ..User-Agent: Mo
    0x0110   7A 69 6C 6C 61 2F 34 2E-30 20 28 63 6F 6D 70 61   zilla/4.0 (compa
    0x0120   74 69 62 6C 65 3B 20 4D-53 49 45 20 36 2E 30 3B   tible; MSIE 6.0;
    0x0130   20 57 69 6E 64 6F 77 73-20 4E 54 20 35 2E 31 3B    Windows NT 5.1;
    0x0140   20 53 56 31 3B 20 2E 4E-45 54 20 43 4C 52 20 31    SV1; .NET CLR 1
    0x0150   2E 31 2E 34 33 32 32 29-0D 0A 48 6F 73 74 3A 20   .1.4322)..Host: 
    0x0160   77 77 77 32 39 2E 77 65-62 73 61 6D 62 61 2E 63   www29.websamba.c
    0x0170   6F 6D 0D 0A 43 6F 6E 74-65 6E 74 2D 4C 65 6E 67   om..Content-Leng
    0x0180   74 68 3A 20 31 38 0D 0A-43 6F 6E 6E 65 63 74 69   th: 18..Connecti
    0x0190   6F 6E 3A 20 4B 65 65 70-2D 41 6C 69 76 65 0D 0A   on: Keep-Alive..
    0x01A0   43 61 63 68 65 2D 43 6F-6E 74 72 6F 6C 3A 20 6E   Cache-Control: n
    0x01B0   6F 2D 63 61 63 68 65 0D-0A 43 6F 6F 6B 69 65 3A   o-cache..Cookie:
    0x01C0   20 41 53 50 53 45 53 53-49 4F 4E 49 44 41 51 41    ASPSESSIONIDAQA
    0x01D0   53 44 51 41 52 3D 42 4B-4F 4F 4F 44 44 41 4D 45   SDQAR=BKOOODDAME
    0x01E0   43 48 4E 4E 47 47 4A 43-4A 43 4A 49 43 4B 0D 0A   CHNNGGJCJCJICK..
    0x01F0   0D 0A 54 31 3D 25 43 34-25 45 33 25 42 41 25 43   ..T1=%C4%E3%BA%C
    0x0200   33 31 32 33                                       3123
      

  7.   

    你看一下ie发过来的请求头的contenttype,然后把body部分转换成他的编码
      

  8.   

    经过 “Iambest(飞翔的雄鹰)” 兄 这么一说,我也注意到了,如果 POST 时,Header 中有:Content-Type: application/x-www-form-urlencoded这一行的话,那么实际上已经指明了是已经 URLEncoded 的。如果未指明,或者说的是其他的类型,那么就应该按照相应的格式来处理。
      

  9.   

    我和上楼的有一样的想法,
    resquest.setEconding('gb2312')
      

  10.   

    采用smartupload上传得信息,服务端不要进行任何转换就是正确得汉字。
    呵呵,application/x-www-form-urlencoded的确实要urldecode进行处理。
    我测试时候: str = new String(buf2,"iso8859-1");(@此处有一问)
       int pos=str.indexOf("\r\n");
                                            String body = str.substring(pos);
                                            body=java.net.URLDecoder.decode(body);
                                            System.out.println("body is:"+body);
    我现在的一问是:str = new String(buf2,"iso8859-1");这里不管采用iso8859-1,还是gb2312
    ,还是采用默认的utf(java默认吧,没错吧),得出的body都是正确的?
    我测试的htm里有:<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    ????
      

  11.   

    1. int pos=str.indexOf("\r\n"); //每一条 Header 都有 \r\n ,真正提交的内容应该是从 "\r\n\r\n" 之后开始的,因此 (indexOf("\r\n\r\n") + 4) 开始才是提交的内容。前面都是 HTTP Headers。
    2. str = new String(buf2,"iso8859-1");(@此处有一问) 应该说,这里不管采用iso8859-1,还是gb2312, 还是采用utf8,得出的body都是正确的?是的,因为 urlencode 之后的字节,都是 0-127 的,超过 127 的都被转化成为 %XX 形式了,而 iso8859-1,gb2312,utf8 都是兼容 0-127 范围的 ASCII 的。但是最好是采用 iso8859-1
      

  12.   

    http://www.htok.net/oursite/servlet/SuperFace/forum/forum2.html?htokid=c0.0.2&id=24
      

  13.   

    我发现只对form里的数据进行urlencode(不管是get还是post),而对于其它跟在?之后的查询串是不会进行urlencode的。
      

  14.   

    又有新的要问了:浏览器在发送请求之前,是先对form里的内容进行urlencode,然后再按照
    <meta http-equiv="Content-Type" content="text/html; charset=iso8859-1">中指定的编码方式进行转吗,还是先转吗,然后再进行urlencode,再发送?