JAVA 는 URL 클래스 openStream 의 한 경로 에서 파일 이름 이 중국어 인 문 제 를 사용 합 니 다.

7357 단어 자바
url 에 중국어,빈 칸 또는 작은 따옴표 등 문자 가 있 을 수 있 습 니 다.재 인 코딩 을 해 야 합 니 다.해결 방법 은 다음 과 같 습 니 다.
publich void  test(){
  url = encodeURLChinese(url);
}
/**
     *          URL  
     *
     * @param url
     * @return
     */
    public static String encodeURLChinese(String url) {
        if (StringUtils.isEmpty(url)) {
            return null;
        }
        url = StringUtils.trim(url);
        try {
            if (!needEncoding(url)) {
                //      
                return url;
            } else {
                //     

                String allowChars = ".!*'();:@&=+_\\-$,/?#\\[\\]{}|\\^~`<>%\"";
//              String  allowChars = ".!*'();:@&=+_\\-$,/?#\\[\\]{}|\\^~`<>%\"";
                // UTF-8   
                return encode(url, ENCODE_FORMAT_UTF8, allowChars, false);

            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     *     url      ,          
     *
     * @param url
     * @return
     */
    public static boolean needEncoding(String url) {
        //            
//      String allowChars = SystemConfig.getValue("ENCODING_ALLOW_REGEX",
//              Constants.ENCODING_ALLOW_REGEX);
        if (url.matches("^[0-9a-zA-Z.:/?=&%~`#()-+]+$")) {
            return false;
        }

        return true;
    }
    /**
     *               
     *
     * @param s
     *                   
     * @param enc
     *                
     * @param allowed
     *                    
     * @param lowerCase
     *            true:   false:  
     * @return
     * @throws java.io.UnsupportedEncodingException
     */
    public static final String encode(String s, String enc, String allowed,
                                      boolean lowerCase) throws UnsupportedEncodingException {

        byte[] bytes = s.getBytes(enc);
        int count = bytes.length;

        /*
         * From RFC 2396:
         *
         * mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")" reserved =
         * ";" | "/" | ":" | "?" | "@" | "&" | "=" | "+" | "$" | ","
         */
        // final String allowed = "=,+;.'-@&/$_()!~*:"; // '?' is omitted
        char[] buf = new char[3 * count];
        int j = 0;

        for (int i = 0; i < count; i++) {
            if ((bytes[i] >= 0x61 && bytes[i] <= 0x7A) || // a..z
                    (bytes[i] >= 0x41 && bytes[i] <= 0x5A) || // A..Z
                    (bytes[i] >= 0x30 && bytes[i] <= 0x39) || // 0..9
                    (allowed.indexOf(bytes[i]) >= 0)) {
                buf[j++] = (char) bytes[i];
            } else {
                buf[j++] = '%';
                if (lowerCase) {
                    buf[j++] = Character.forDigit(0xF & (bytes[i] >>> 4), 16);
                    buf[j++] = Character.forDigit(0xF & bytes[i], 16);
                } else {
                    buf[j++] = lowerCaseToUpperCase(Character.forDigit(
                            0xF & (bytes[i] >>> 4), 16));
                    buf[j++] = lowerCaseToUpperCase(Character.forDigit(
                            0xF & bytes[i], 16));
                }

            }
        }
        return new String(buf, 0, j);
    }

    public static char lowerCaseToUpperCase(char ch) {
        if (ch >= 97 && ch <= 122) { //                
            ch = (char) (ch - 32);
        }
        return ch;
    }

좋은 웹페이지 즐겨찾기