무시된 큰따옴표

5383 단어
무시된 큰따옴표
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);
 
 
 
 

좋은 웹페이지 즐겨찾기