写了一个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转换成字节流(还是字符串)。这个中间的细节我不懂,
请大家告诉我其中的道理,要怎么转换。
关于编码方式,字符串,字节流之间的关系,转换方式,希望大家指导指导
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转换成字节流(还是字符串)。这个中间的细节我不懂,
请大家告诉我其中的道理,要怎么转换。
关于编码方式,字符串,字节流之间的关系,转换方式,希望大家指导指导
DataInputStream.readUTF();
我试一试
2. 发送时,除了按照编码转化成字节串外,还要通过 URLEncode 编码,也就是 %XX 的格式
因此,搂主需要首先 URLDecode 以后,再用与提交页面相同的编码将字节流恢复成字符串才能看到汉字。
发送时候的编码不会根据页面的编码来确定吧,应该是统一编码方式吧。页面编码中指定的charset="gb2312"等东东,应该是告诉浏览器怎样解析服务端发过来的东东吧。
呵呵,我是没什么映象了,请大家来把问题确认一下
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
resquest.setEconding('gb2312')
呵呵,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">
????
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
<meta http-equiv="Content-Type" content="text/html; charset=iso8859-1">中指定的编码方式进行转吗,还是先转吗,然后再进行urlencode,再发送?