java.net.URLEncoder类对空格的处理

来源:互联网 发布:linux apt命令详解 编辑:程序博客网 时间:2024/04/29 11:45

String s = java.net.URLEncoder.encode(" ", "utf-8");
无论后面的编码是什么,转码之后s始终等于+

查看jdk源码java.net.URLEncoder,原来对空格的处理就是:
if (c == ' ') {
 c = '+';
 needToChange = true;
}
已经写的很死,没办法发改,如果要将空格换成其他的要通过String的方法
如:
String url = http://localhost:8080/one/on e.jsp//若要被浏览器认识
则必须:
url = url.replaceAll(" ", "%20");
得到url = http://localhost:8080/one/on%20e.jsp
下面是java jdk1.6中java.net.URLEncoder类的源码,用红线标出来到是空格所走的路线

package java.net;

import java.io.ByteArrayOutputStream;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.io.CharArrayWriter;
import java.nio.charset.Charset;
import java.nio.charset.IllegalCharsetNameException;
import java.nio.charset.UnsupportedCharsetException ;
import java.util.BitSet;
import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.security.action.GetBooleanAction;
import sun.security.action.GetPropertyAction;

public class URLEncoder {
    static BitSet dontNeedEncoding;
    static final int caseDiff = ('a' - 'A');
    static String dfltEncName = null;

    static {
  dontNeedEncoding = new BitSet(256);
  int i;
  for (i = 'a'; i <= 'z'; i++) {
   dontNeedEncoding.set(i);
  }
  for (i = 'A'; i <= 'Z'; i++) {
   dontNeedEncoding.set(i);
  }
  for (i = '0'; i <= '9'; i++) {
   dontNeedEncoding.set(i);
  }
  dontNeedEncoding.set(' '); /* encoding a space to a + is done
      * in the encode() method */
  dontNeedEncoding.set('-');
  dontNeedEncoding.set('_');
  dontNeedEncoding.set('.');
  dontNeedEncoding.set('*');
  dfltEncName = (String)AccessController.doPrivileged (
   new GetPropertyAction("file.encoding")
  );
    }
    private URLEncoder() { }
    @Deprecated
    public static String encode(String s) {
  String str = null;
  try {
   str = encode(s, dfltEncName);
  } catch (UnsupportedEncodingException e) {
    
  }
  return str;
    }

    public static String encode(String s, String enc) throws UnsupportedEncodingException {

 boolean needToChange = false;
  StringBuffer out = new StringBuffer(s.length());
  Charset charset;
  CharArrayWriter charArrayWriter = new CharArrayWriter();
  if (enc == null)
   throw new NullPointerException("charsetName");
  try {
   charset = Charset.forName(enc);
  } catch (IllegalCharsetNameException e) {
   throw new UnsupportedEncodingException(enc);
  } catch (UnsupportedCharsetException e) {
   throw new UnsupportedEncodingException(enc);
  }
  for (int i = 0; i < s.length();) {
   int c = (int) s.charAt(i);
   if (dontNeedEncoding.get(c)) {
    if (c == ' ') {
     c = '+';
     needToChange = true;
    }
    out.append((char)c);
    i++;

   } else {
    do {
     charArrayWriter.write(c);
     if (c >= 0xD800 && c <= 0xDBFF) {
      if ( (i+1) < s.length()) {
       int d = (int) s.charAt(i+1);
       if (d >= 0xDC00 && d <= 0xDFFF) {
        harArrayWriter.write(d);
        i++;
       }
      }
     }
     i++;
    } while (i < s.length() && !dontNeedEncoding.get((c = (int) s.charAt(i))));

    charArrayWriter.flush();
    String str = new String(charArrayWriter.toCharArray());
    byte[] ba = str.getBytes(charset);
    for (int j = 0; j < ba.length; j++) {
     out.append('%');
     char ch = Character.forDigit((ba[j] >> 4) & 0xF, 16);
     if (Character.isLetter(ch)) {
      ch -= caseDiff;
     }
     out.append(ch);
     ch = Character.forDigit(ba[j] & 0xF, 16);
     if (Character.isLetter(ch)) {
      ch -= caseDiff;
     }
     out.append(ch);
    }
    charArrayWriter.reset();
    needToChange = true;
   }
  }
  return (needToChange? out.toString() : s);
    }
}