웹 페이지 에서 발생 한 인 코딩 문제
4466 단어 부호화
해결 방향:
먼저 기본 방식 으로 웹 페이지 소스 코드 를 내 려 와 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 버 전
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정렬이 원본 비교를 지원하지 않는 대상너는 같은 유형의 대상을 정렬하고 싶지만, 그들은 원생의 비교 조작을 지원하지 않는다. 내장된sorted () 함수에는 키워드 매개 변수 키가 있습니다.callable 대상을 전송할 수 있습니다. 이callable ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.