무시된 큰따옴표
mht 파일에서 html 내용을 추출하는 프로그램에는 다음과 같은 코드가 포함되어 있습니다.
String strEncodng = getEncoding(bp1);
String strText = getHtmlText(bp1, strEncodng);
mht 파일을 처리할 때 다음과 같은 오류를 보고합니다.
java.io.UnsupportedEncodingException: "unicode"
그래서 strencodng이 유니버설 때문에 그런 것 같습니다. 파일 자체가 설정한 인코딩에 문제가 있어서 다른 것으로 바꾸어 보겠습니다.UTF8을 시도해 봤자 안 되고 UTF16을 시도해 봤자 돼요.
String strEncodng = getEncoding(bp1);
// strEncodng = "UTF8"
strEncodng = "UTF16";
String strText = getHtmlText(bp1, strEncodng);
물론 프로그램은 이렇게 쓸 수 없습니다. 그렇지 않으면 다른mht 파일을 정확하게 처리할 수 없습니다.유니코드로 인코딩할 때 UTF16으로 변경하는 패치를 만듭니다.
String strEncodng = getEncoding(bp1);
if (strEncodng.equals("unicode")) {
strEncodng = "UTF16";
}
String strText = getHtmlText(bp1, strEncodng);
다시 한 번 테스트해 보니 역시 상부의 이상을 보고하는 것이 이상하다.그래서 로그 출력을 넣어서 도대체 어떻게 된 일인지 보았다
String strEncodng = getEncoding(bp1);
log.debug("strEncodng=" + strEncodng);
if (strEncodng.equals("unicode")) {
strEncodng = "UTF16";
}
log.debug("strEncodng=" + strEncodng);
String strText = getHtmlText(bp1, strEncodng);
실행, 두 번의 로그 출력과 같이if판단에 들어가지 않았습니다.
01:05:01.307 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng="unicode"
01:05:01.307 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng="unicode"
strencodng에 특수 문자가 포함되어 있어서 출력이 보이지 않습니까?그래서 몇 줄의 코드를 더해서 확인했다
String strEncodng = getEncoding(bp1);
log.debug("strEncodng=" + strEncodng);
if (strEncodng.equals("unicode")) {
strEncodng = "UTF16";
} else {
log.debug("strEncodng.length=" + strEncodng.length());
log.debug("strEncodng.contains=" + strEncodng.contains("unicode"));
for (int i = 0; i < strEncodng.length(); ++i) {
log.debug("strEncodng[" + i + "]=" + strEncodng.charAt(i) + " " + (int) strEncodng.charAt(i));
}
}
log.debug("strEncodng=" + strEncodng);
String strText = getHtmlText(bp1, strEncodng);
재집행
01:05:01.307 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng="unicode"
01:05:01.307 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng.length=9
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng.contains=true
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[0]=" 34
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[1]=u 117
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[2]=n 110
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[3]=i 105
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[4]=c 99
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[5]=o 111
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[6]=d 100
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[7]=e 101
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[8]=" 34
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng="unicode"
드디어strencodng에는 유니버설만 포함된 것이 아니라 앞뒤에 더블 인덱스가 감싸져 있는 것을 발견했다.더블 따옴표만 빼면 될 것 같아서 코드를 바꿨는데, 아래와 같다
String strEncodng = getEncoding(bp1);
strEncodng = strEncodng.replace("\"", "");
String strText = getHtmlText(bp1, strEncodng);
좋아, 통과했어.다 그 무시된 더블 따옴표잖아.사실 일찍이 이상을 볼 때와 로그를 볼 때'uncode'의 더블 인덱스는 문자열의 일부분이라는 경각심을 느꼈다.
PS: 실제 테스트에서strencodng은null일 수도 있고 이 판단을 더하면 더욱 타당하다.
String strEncodng = getEncoding(bp1);
if (strEncodng == null) {
strEncodng = "GBK";
} else {
strEncodng = strEncodng.replace("\"", "");
}
String strText = getHtmlText(bp1, strEncodng);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.