2011-01-28 3 views
3

URL에서 중국어 문자로 URL 연결을 설정하는 데 문제가 있습니다. 그것은 라틴 문자와 함께 작동 :한자 (URI)가 잘못된 URI

String xstr = "维也纳恩斯特哈佩尔球场" ; 
URI uri = new URI("http","ajax.googleapis.com","/ajax/services/language/detect","v=1.0&q="+xstr,null); 
URL url = uri.toURL(); 
URLConnection connection = url.openConnection(); 
InputStream is = connection.getInputStream() ; 

는 getInputStream() 호출 결과 :

java.lang.IllegalArgumentException: Invalid uri 'http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q=???????????': Invalid query 
+0

이상한를, 내가했던 작은 JUnit 테스트 케이스와 예외를 얻지 못했습니다. OpenJDK 64 비트 서버 VM (빌드 19.0-b09, 혼합 모드)'Java 버전 1.6.0_20 "OpenJDK 런타임 환경 (IcedTea6 1.9.4) (6b20-1.9.4-0ubuntu1)을 실행 중입니다. .java 파일 인코딩은 UTF-8입니까? – hleinone

+0

확실히 - 문자가 해당 단계가 통과되는 한 예상대로 데이터 저장소로 이동합니다. 인터넷 검색에서 오라클 페이지 http://download.oracle.com/javase/1.4.2/docs/api/java/net/URI.html이 허용되는 것으로 나타났습니다. "...에없는 유니 코드 문자 US-ASCII 문자 집합은 Character.isISOControl 메서드에 따라 제어 문자가 아니며 Character.isSpaceChar 메서드에 따라 공백 문자가 아닙니다 (US-ASCII로 제한되는 RFC 2396의 편차). " 어쩌면 구현에 달려 있을까요? 내 것은 안드로이드 다. –

답변

7

이 문제는 URI.toURL()이 비 ASCII 문자를 백분율로 인코딩하지 않기 때문에 발생합니다. 대신 다음을 사용하십시오.

URL url = new URL(uri.toASCIIString()); 
+0

안녕하세요, 나는 차도를 삽으로 몇 분 간 나가고 돌아와서 내 질문에 답합니다. 나는이 사이트를 좋아한다 ... –

+3

다음과 같은 결과를 얻을 수도있다 :'String xstr = URLEncoder.encode ("维也纳 恩斯特哈 佩尔 球场", "utf-8"); URL url = 새 URL ("http", "ajax.googleapis.com", "/ ajax/services/language/detect? v = 1.0 & q ="+ xstr); – hleinone

+0

추가 테스트를 위해 URLEncoder가이 목적을 위해 toASCIIString보다 잘 작동 함을 확인하십시오. 후자는 문자열에 대괄호가 포함되어 있으면 URL 혼자서 & URL에 합법적이지 않습니다. –

0

나는 그것이 "UTF-8"문자 세트에 관한 생각합니다. 자세한 내용은 topic을 참조하십시오. chinese in java

0

URI RFC (섹션 2.4 참조)에서 비 US-ASCII 문자는 URI에서 유효하지 않습니다. 당신은 그들을 인코딩해야합니다.

2

axtavt 님의 답변에 따르면 광부에서 감사합니다. 그냥 하나의 코멘트 (나는 당신이 URL로 시작하는 경우

, 당신은 당신이 URI 구축하기 전에 따옴표를 인코딩해야 답 : 아래에 언급하는 방법을 알아낼 수 없습니다 :

String s = "your_url?with=\"quotes\""; 
URI su = new URI (s.replaceAll("\"", "%22"); 
URL ur = new URL(su.toASCIIString()); 
관련 문제