📄 urlencoded.java
字号:
if (key!=null) { buffer.append((byte)b); break; } key = buffer.toString(); buffer.reset(); break; case '+': buffer.append((byte)' '); break; case '%': int dh=in.read(); int dl=in.read(); if (dh<0||dl<0) break; buffer.append((byte)((TypeUtil.convertHexDigit((byte)dh)<<4) + TypeUtil.convertHexDigit((byte)dl))); break; default: buffer.append((byte)b); break; } if (maxLength>=0 && (++totalLength > maxLength)) throw new IllegalStateException("Form too large"); } if (key != null) { value = buffer.length()==0?"":buffer.toString(); buffer.reset(); map.add(key,value); } else if (buffer.length()>0) { map.add(buffer.toString(), ""); } } } /* -------------------------------------------------------------- */ public static void decodeUtf16To(InputStream in, MultiMap map, int maxLength) throws IOException { InputStreamReader input = new InputStreamReader(in,StringUtil.__UTF16); StringBuffer buf = new StringBuffer(); int c; int length=0; if (maxLength<0) maxLength=Integer.MAX_VALUE; while ((c=input.read())>0 && length++<maxLength) buf.append((char)c); decodeTo(buf.toString(),map,StringUtil.__UTF8); } /* -------------------------------------------------------------- */ /** Decoded parameters to Map. * @param in the stream containing the encoded parameters */ public static void decodeTo(InputStream in, MultiMap map, String charset, int maxLength) throws IOException { if (charset==null || StringUtil.__ISO_8859_1.equals(charset)) { decode88591To(in,map,maxLength); return; } if (StringUtil.__UTF8.equalsIgnoreCase(charset)) { decodeUtf8To(in,map,maxLength); return; } if (StringUtil.__UTF16.equalsIgnoreCase(charset)) // Should be all 2 byte encodings { decodeUtf16To(in,map,maxLength); return; } synchronized(map) { String key = null; String value = null; int c; int digit=0; int digits=0; int totalLength = 0; ByteArrayOutputStream2 output = new ByteArrayOutputStream2(); int size=0; while ((c=in.read())>0) { switch ((char) c) { case '&': size=output.size(); value = size==0?"":output.toString(charset); output.setCount(0); if (key != null) { map.add(key,value); } else if (value!=null&&value.length()>0) { map.add(value,""); } key = null; value=null; break; case '=': if (key!=null) { output.write(c); break; } size=output.size(); key = size==0?"":output.toString(charset); output.setCount(0); break; case '+': output.write(' '); break; case '%': digits=2; break; default: if (digits==2) { digit=TypeUtil.convertHexDigit((byte)c); digits=1; } else if (digits==1) { output.write((digit<<4) + TypeUtil.convertHexDigit((byte)c)); digits=0; } else output.write(c); break; } totalLength++; if (maxLength>=0 && totalLength > maxLength) throw new IllegalStateException("Form too large"); } size=output.size(); if (key != null) { value = size==0?"":output.toString(charset); output.setCount(0); map.add(key,value); } else if (size>0) map.add(output.toString(charset),""); } } /* -------------------------------------------------------------- */ /** Decode String with % encoding. * This method makes the assumption that the majority of calls * will need no decoding. */ public static String decodeString(String encoded,int offset,int length,String charset) { if (charset==null || StringUtil.isUTF8(charset)) { Utf8StringBuffer buffer=null; for (int i=0;i<length;i++) { char c = encoded.charAt(offset+i); if (c<0||c>0xff) { if (buffer==null) { buffer=new Utf8StringBuffer(length); buffer.getStringBuffer().append(encoded,offset,offset+i+1); } else buffer.getStringBuffer().append(c); } else if (c=='+') { if (buffer==null) { buffer=new Utf8StringBuffer(length); buffer.getStringBuffer().append(encoded,offset,offset+i); } buffer.getStringBuffer().append(' '); } else if (c=='%' && (i+2)<length) { if (buffer==null) { buffer=new Utf8StringBuffer(length); buffer.getStringBuffer().append(encoded,offset,offset+i); } while(c=='%' && (i+2)<length) { try { byte b=(byte)TypeUtil.parseInt(encoded,offset+i+1,2,16); buffer.append(b); i+=3; } catch(NumberFormatException nfe) { buffer.getStringBuffer().append('%'); for(char next; ((next=encoded.charAt(++i+offset))!='%');) buffer.getStringBuffer().append((next=='+' ? ' ' : next)); } if (i<length) c = encoded.charAt(offset+i); } i--; } else if (buffer!=null) buffer.getStringBuffer().append(c); } if (buffer==null) { if (offset==0 && encoded.length()==length) return encoded; return encoded.substring(offset,offset+length); } return buffer.toString(); } else { StringBuffer buffer=null; try { for (int i=0;i<length;i++) { char c = encoded.charAt(offset+i); if (c<0||c>0xff) { if (buffer==null) { buffer=new StringBuffer(length); buffer.append(encoded,offset,offset+i+1); } else buffer.append(c); } else if (c=='+') { if (buffer==null) { buffer=new StringBuffer(length); buffer.append(encoded,offset,offset+i); } buffer.append(' '); } else if (c=='%' && (i+2)<length) { if (buffer==null) { buffer=new StringBuffer(length); buffer.append(encoded,offset,offset+i); } byte[] ba=new byte[length]; int n=0; while(c>=0 && c<=0xff) { if (c=='%') { if(i+2<length) { try { ba[n++]=(byte)TypeUtil.parseInt(encoded,offset+i+1,2,16); i+=3; } catch(NumberFormatException nfe) { ba[n-1] = (byte)'%'; for(char next; ((next=encoded.charAt(++i+offset))!='%');) ba[n++] = (byte)(next=='+' ? ' ' : next); } } else { ba[n++] = (byte)'%'; i++; } } else if (c=='+') { ba[n++]=(byte)' '; i++; } else { ba[n++]=(byte)c; i++; } if (i>=length) break; c = encoded.charAt(offset+i); } i--; buffer.append(new String(ba,0,n,charset)); } else if (buffer!=null) buffer.append(c); } if (buffer==null) { if (offset==0 && encoded.length()==length) return encoded; return encoded.substring(offset,offset+length); } return buffer.toString(); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } } /* ------------------------------------------------------------ */ /** Perform URL encoding. * Assumes 8859 charset * @param string * @return encoded string. */ public static String encodeString(String string) { return encodeString(string,StringUtil.__UTF8); } /* ------------------------------------------------------------ */ /** Perform URL encoding. * @param string * @return encoded string. */ public static String encodeString(String string,String charset) { if (charset==null) charset=StringUtil.__UTF8; byte[] bytes=null; try { bytes=string.getBytes(charset); } catch(UnsupportedEncodingException e) { // Log.warn(LogSupport.EXCEPTION,e); bytes=string.getBytes(); } int len=bytes.length; byte[] encoded= new byte[bytes.length*3]; int n=0; boolean noEncode=true; for (int i=0;i<len;i++) { byte b = bytes[i]; if (b==' ') { noEncode=false; encoded[n++]=(byte)'+'; } else if (b>='a' && b<='z' || b>='A' && b<='Z' || b>='0' && b<='9') { encoded[n++]=b; } else { noEncode=false; encoded[n++]=(byte)'%'; byte nibble= (byte) ((b&0xf0)>>4); if (nibble>=10) encoded[n++]=(byte)('A'+nibble-10); else encoded[n++]=(byte)('0'+nibble); nibble= (byte) (b&0xf); if (nibble>=10) encoded[n++]=(byte)('A'+nibble-10); else encoded[n++]=(byte)('0'+nibble); } } if (noEncode) return string; try { return new String(encoded,0,n,charset); } catch(UnsupportedEncodingException e) { // Log.warn(LogSupport.EXCEPTION,e); return new String(encoded,0,n); } } /* ------------------------------------------------------------ */ /** */ public Object clone() { return new UrlEncoded(this); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -