웹 페이지 에서 발생 한 인 코딩 문제

4466 단어 부호화
httpclient 를 이용 하여 웹 페이지 를 오 르 는 과정 에서 웹 페이지 의 인 코딩 에 따라 오 르 는 것 이 필요 합 니 다. 우리 가 필요 로 하 는 웹 페이지 인 코딩 은 html 의 meta 태그 에서 conten - type 속성 중의 charset 필드 에서 정의 되 기 때문에 난 코드 를 방지 하기 위해 charset 필드 의 인 코딩 방식 을 가 져 와 야 합 니 다.
해결 방향:
먼저 기본 방식 으로 웹 페이지 소스 코드 를 내 려 와 byte 형 배열 에 저장 합 니 다.이후 findCharset 방법 으로 정규 표현 식 을 이용 하여 meta 탭 의 인 코딩 을 얻 습 니 다.마지막 으로 byte 배열 과 얻 은 인 코딩 을 이용 하여 String 대상 (즉, 마지막 웹 소스 코드) 을 재 구성 합 니 다. 웹 소스 코드 에 인 코딩 정의 가 없 으 면 http 프로 토 콜 헤더 의 인 코딩 정 의 를 받 아야 합 니 다.
구체 적 인 코드 는 다음 과 같다.

//    
	public static String Default_charet = null; 
	
	public static String findCharSet(String html){
		
		//       
		String charset = Default_charet;
		
		String regex = "<meta.* charset.*>|<META.* charset.*>";
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(html);
		while(m.find()){
			String s = m.group();
			if(s.matches(".*charset.*")){
				try{
					int startindex = s.lastIndexOf("charset=")+"charset=".length();
//					System.out.println(startindex);
					int endindex = startindex;
					while(s.charAt(endindex) != '"')
						endindex++;
//					System.out.println(endindex);
					charset = s.substring(startindex,endindex);
				}catch(IndexOutOfBoundsException e){
					System.out.println("Encoding error ! ");
				}		
			}
		}
		return charset;
	}
	
	public static byte[] crawl(String url){
//		System.out.println(url);
		//      
		byte[] result = null;
		
		//  HttpClientBuilder
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        //HttpClient
        CloseableHttpClient closeableHttpClient = httpClientBuilder.build();

        HttpGet httpGet = new HttpGet(url);
        
        
        
        try {
        	
            //         
        	RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(100000).setConnectTimeout(100000).build();
          	httpGet.setConfig(requestConfig);
        	
          	
        	//  get  
          	HttpResponse httpResponse = closeableHttpClient.execute(httpGet);          		
   	
           [color=red] //        
            HttpEntity entity = httpResponse.getEntity();
            //     http             
            String content_type = entity.getContentType().toString();
            int  index = content_type.toLowerCase().lastIndexOf("charset=")+"charset=".length();
            Default_charet = content_type.substring(index);
[/color]            
            //    
            if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
         
	            //          
	            if (entity != null) {
	            	try{
	            		result = EntityUtils.toByteArray(entity);
	            	}catch(SocketTimeoutException e){}
//	                
	            }
            }
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
        
            try {
                //        
                closeableHttpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
	
	public static String downPage(String url){
		
		String regex = "[\\S]*\\.xls|[\\S]*\\.jpg|[\\S]*\\.doc|[\\S]*\\.docx"+
				"|[\\S]*\\.rar|[\\S]*\\.pdf|[\\S]*\\.css|[\\S]*\\.exe"+
				"|[\\S]*\\.JPG|[\\S]*\\.ppt|[\\S]*\\.PPT|[\\S]*\\.wmv";
		if(url.matches(regex))
			return null;
		
		//      
		String result = null;
		
		//      ,            String  
		byte []b = crawl(url);
		
		if(b==null)
			return null;
		String s = new String(b);
//		System.out.println(s);
        try {
			result = new String(b,findCharSet(s));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        
        return result;
	}
	

httpclient - 4.3.1 버 전

좋은 웹페이지 즐겨찾기