情况是这样的:
http://db.test.net:7777/DB_Server/policy/add是别人提供的接口,他提供了把字段存入数据库的功能。存入数据库的中文转为gbk不乱码。
我通过浏览器输入地址http://db.test.net:7777/DB_Server/policy/add?selfRe=%C4%E3%BA%C3(%C4%E3%BA%C3是“你好”转为GBK的编码),然后回车。
可以看见在数据库表中的存入selfRe字段的值为“你好”,没有乱码.但是我在实际中,我需要通过流的方式去请求http://db.test.net:7777/DB_Server/policy/add?selfRe=%C4%E3%BA%C3这个路径。结果去乱码了。弄了2天了,大家帮帮忙。流的方式的方法这样的:
  public static String getContent(String urls)
    {
    
     StringBuffer sb=new StringBuffer();
     Pattern p = Pattern.compile("\\?");
     String [] s=p.split(urls);
     BufferedReader reader=null;
     try {
URL url = new URL(s[0]);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
            os.write(s[1].getBytes());
             reader = new BufferedReader(new InputStreamReader(
(conn.getInputStream()),"gb2312"));
String line=reader.readLine();
while(line!=null)
{
sb.append(line);
line=reader.readLine();
}

} catch (MalformedURLException e) {
} catch (IOException e) {
}finally{
try {
if(reader!=null)
reader.close();
} catch (IOException e) {
}
}
return sb.toString();
    }然后我在main中执行getContent(http://db.test.net:7777/DB_Server/policy/add?selfRe=%C4%E3%BA%C3)。
可以看见记录在数据库也添加了,但是selfRe的值却乱码了。我的结论是通过流请求乱码了,在地址栏请求却没有乱码。大家帮帮忙,看下是什么原因?怎么解决啊

解决方案 »

  1.   

    java.net.URLEncoder  这里有个方法就是专门处理  你这种问题的,但是你的是通过方法模拟的请求  和正真的请求应该是有区别的
      

  2.   


    就是这个方法 public static String encode(String s,
                                String enc)
                         throws UnsupportedEncodingException
      

  3.   

    encodeURI()把他的路径放在括号里面试试
      

  4.   

    URL地址传中文 是需要进行转码和解码 
    java.net.URLEncoder 转码
    java.net.URLDecoder 解码
      

  5.   

    selfRe=%C4%E3%BA%C3.我对中文已经转码了啊。
    这个就相当于selfRe=java.net.URLEncoder("你好","gbk")啊。
    两边的编码方式是一样的啊。
    存入是数据库是gbk格式的中文。我在浏览器上请求可以存进没有乱码啊。我还需要哪里转码?
      

  6.   

    现在乱码  显示的是什么?   %C4%E3%BA%C3   这一串吗?
      

  7.   

    是的,就是%C4%E3%BA%C3这一串乱了
      

  8.   


    你自己测试一下   你的方法都没有执行到  return sb.toString();  这行
      

  9.   

    我把你的代码复制过去了,确定没有执行到这句    如果你认为是都执行了,你可以在调用这个方法的地方输出一下  看是不是拿到返回的String了  如果拿到了,看得到的是不是乱码
      

  10.   

    得到的不是乱码。我打印了 System.out.println(getContent(url));结果是<?xml version="1.0" encoding="GBK"?><root><code>1</code><desc>添加成功</desc></root>没有乱码。
      

  11.   

    代码就是那个啊,我没有发错。 public static String getContent(String urls)
        {
        
         StringBuffer sb=new StringBuffer();
         Pattern p = Pattern.compile("\\?");
         String [] s=p.split(urls);
         BufferedReader reader=null;
         try {
    URL url = new URL(s[0]);
    URLConnection conn = url.openConnection();
    conn.setDoOutput(true);
    OutputStream os = conn.getOutputStream();
                os.write(s[1].getBytes());
                 reader = new BufferedReader(new InputStreamReader(
    (conn.getInputStream()),"gbk"));
    String line=reader.readLine();
    while(line!=null)
    {
    sb.append(line);
    line=reader.readLine();
    }

    } catch (MalformedURLException e) {
    } catch (IOException e) {
    }finally{
    try {
    if(reader!=null)
    reader.close();
    } catch (IOException e) {
    }
    }
    return sb.toString();
        }
      

  12.   

    自己再写个add类  模拟一下,你这没办法访问你的DB_Server/policy/add类  只能再写一个,然后去里边取一下值确定一下“乱”在什么位置了
      

  13.   

    嗯,那个类是别人写好的啊。我也没有啊。他告诉我中文就转为gbk。的确我转为gbk在地址栏上输上路径,存进去不乱码。我就不好在问别人了啊。用流就是乱码啊?除了流,还有其他的方法不?就是要把那个路径提交出去就可以了。