어.. 한글이 깨진다..
그러니까 검색을 한 후에 두번 째 페이지로 넘어갈 때 파라미터가(검색어) 깨진다.
??? 로 나오는데 검색어가 두글자라면 ?? 이렇고
5글자이면 ?????라고 보인다..
그러니까..우선 파라미터는 잘 넘긴 것으로 판단된고.. 물음표로 나오는 경우가
인코디잉 두번 되서 그렇다고 한다. 그래서 디코딩을 해봤지만 소용이 없었다..
여전히 물음표..
http://youngrok.com/%EC%9E%90%EB%B0%94%EC%9B%B9%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%9D%98%EA%B8%B0%EB%B3%B8#header-4.2.5
검색어 : jsp ,페이징 , get 방식 한글깨짐,파라미터받을때
http://binalee.tistory.com/72
http://egloos.zum.com/future2013/v/5497711
http://diyall.tistory.com/685
검색어 : utf-8인지 확인 , java
http://tost.tistory.com/33
http://nigh.tistory.com/25
http://gongam100.tistory.com/10
http://code.p-ark.co.kr/309
검색어 : string , charset 확인하기
http://gwons.blogspot.kr/2014/11/java.html
http://erim1005.blogspot.kr/2013/03/java.html
검색어 : java , 한글이 물음표
http://okky.kr/article/194808
http://gbox3d.tistory.com/entry/javaeuckr
http://nomore7.tistory.com/entry/JAVA-Encoding-%EA%B3%BC-Decoding%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%A6%AC
http://okky.kr/article/240362
http://egloos.zum.com/wjdtncjs/v/3023899
http://lsk925.tistory.com/12
http://blog.naver.com/PostView.nhn?blogId=kyohack&logNo=80125226070
http://egloos.zum.com/ndba/v/2831611
검색어 : utf-8디코딩 , java
http://revf.tistory.com/84
더보기 접기
http://tost.tistory.com/33
한글깨지는건 코딩하면서 꼭 겪는 일인듯 ㄱ- 기냥 회사에서 생활하면서 해결했던 방법을 작성해놓은것을 공개합니당1. 인풋창 (input)의 한글이 깨져요 검색창이나, 검색어를 유지하는 hidden 텍스트창을 보면 한글이 깨져서 들어갔을때를 말합니다. (input type = "text" .... 나 "hidden"같은걸 말합니다.(방법1) jsp소스내에 언어설정request.setCharacterEncoding("UTF-8"); <-- 톰캣 5.5계열에서 사용할겁니다 (방법2) 톰갯설정 변경 (빨간색 추가) -- server.xml-- (대충 90번째라인 언저리) 참고로 주석처리 되어 있는 경우도 있으니,,, 찾아서 주석지우고 빨간색 추가하면됨 <!-- See proxy documentation for more information about using this. --> <Connectorport="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="euc-kr" />
(방법3) 변환함수를 만들어서 해결 (개인적으로 비추합니다, EUC-KR은 EUC-KR이라고하면됨)public static String toUTF8 ( String s )
{
String result = "";
try {
result = new String(s.getBytes("8859_1"),"UTF-8"); //UTF8로 변환
}
catch(Exception e)
{
result = "";
}
return result;
} 응용들어가면 s.getByte("UTF-8"),"EUC-KR"); ... 같은형식도 되지요
(방법4) 이클립스 환경에서 개발할때, 이클립스 서버 설정파일변경 (Server.xml) 이클립스에서도 작업할때 참 난감했지요. 한글 인자값이 깨질때 이렇게 해결했습니다.
< Connector acceptCount = "100" connectionTimeout = "20000" disableUploadTimeout = "true" enableLookups = "false" maxHttpHeaderSize = "8192" maxSpareThreads = "75" maxThreads = "150" minSpareThreads = "25" port = "8080" redirectPort = "8443" useBodyEncodingForURI="true" />
(방법5) 이클립스 환경에서 UTF-8페이지로 개발하는데 한글이 깨져요. <2008.12.23일 추가글> 4번방법으로 좌절먹고 이틀을 헤메다가 나타난 글... 이클립스(eclipse)의 (Server.xml)의 port=8080과 port=8009두개의 connector에 URIEncoding="UTF-8"을 추가한다. <!-- Define an AJP 1.3 Connector on port 8009 --> <Connector enableLookups="false" port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" /> <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 --> <Connector acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192" maxSpareThreads="75" maxThreads="150" minSpareThreads="25" port="8080" redirectPort="8443"URIEncoding="UTF-8" />흐흐 된다. (참고원본 : http://ngweb.tistory.com/124 ) 2. 결과 페이지에서 한글이 깨져요 (방법1) jsp기준으로 해당페이지에
< % @ page language="java" contentType="text/html; charset="UTF-8" % > EUC-KR이면 당연히 그걸로 설정해야죠. 즉, <%@ page language="java" contentType="text/html; charset=UTF-8" %>같은 캐릭터셋 설정이 되어있는지 확인해 봅니다.
(방법2) UTF-8페이지인데... 한글이 깨진다면.... 저장할때 UTF-8로 저장했는지 확인합니다. 참고로 우리팀에서 자주쓰는 에디터 프로그램인 크림슨 에디터는 UTF-8을 지원하지 않습니다. acroediter나 notepad++, 메모장등을 통해서 UTF-8형식으로 저장해야 합니다. (클래스 파일의 경우는 굳이 utf-8로 안해도 동작하던걸로 기억합니다)3. 이상하게 보이지 않는 깨진글자가 한 두개 보여요 에디터로 육안으로 보면 없던 이상한 깨진글자가 실제 브라우저로 보면 보일때가 있습니다. BOM을 인식못해서 생긴 문제라고 합니다. 참고 : http://blog.naver.com/skeehun/150022910124 notepad++에서 형식메뉴 -> convert TO UTF-8 with out BOM 를 통해 제거후 저장하시면 됩니다. (notepad++을 안쓰시면 그런기능이 있나 확인해보시면 됩니당)4. 자바스크립트가 오류나요 캐릭터설정문제로 인해 스크립트가 깨지는 경우가 있습니다. 보통 웹페이지 캐릭터랑 .js파일의 캐릭터셋이 다를때 일어납니다. (예: euc-kr jsp파일에서 , UTF-8의 .js파일을 사용할때) 이럴 경우, < script language='javascript' type="text/javascript" src='/search/akc/akc.js'>< / script > 이런식으로 하면 안되고, 특정 캐릭터셋으로 만들어진 스크립트를 넣을땐 charset을 꼭 써주시면됩니다 < script language='javascript' type="text/javascript" src='/search/akc/akc.js' charset="euc-kr">< / script > 문서 캐릭터셋 보시려면 노트패드에서 새로저장할때 UTF-8인지 ansi인지 확인하시면 된답니다.5. 한글을 주소에 넘겨주는데, 깨져버려요 자바같은곳에서 사용할 때 String kwd = "한글테스트"; String url = "http://green.daum.net/search/searchApi.jsp?coll=green&qry="+ kwd +"&display=10&srt=weight_value "; http = new URL(url); try{ BufferedReader rd = new BufferedReader(new InputStreamReader(http.openStream())); while ((body = rd.readLine()) != null) { out.println(body.length()); } }catch(Exception e) { out.println("stream: error " + e); } 이런식으로 넘겨줄때, 한글이 깨지는 경우가 있다. 그래서 원하는 결과가 안나올때가 있는데,,,, kwd = "%C7%D1%B1%DB%C5%D7%BD%BA%C6%AE" 같이 uri인코딩된 상태로는 잘 되는 문제.. 이 경우는 java.net.URLEncoder.encode(kwd ) 식으로 해결하면 OK. -정선생-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
String word = s;
System.out.println(
"utf-8(1) : "
+
new
String(word.getBytes(
"utf-8"
),
"euc-kr"
));
System.out.println(
"utf-8(2) : "
+
new
String(word.getBytes(
"utf-8"
),
"ksc5601"
));
System.out.println(
"utf-8(3) : "
+
new
String(word.getBytes(
"utf-8"
),
"x-windows-949"
));
System.out.println(
"utf-8(4) : "
+
new
String(word.getBytes(
"utf-8"
),
"iso-8859-1"
));
System.out.println(
"iso-8859-1(1) : "
+
new
String(word.getBytes(
"iso-8859-1"
),
"euc-kr"
));
System.out.println(
"iso-8859-1(2) : "
+
new
String(word.getBytes(
"iso-8859-1"
),
"ksc5601"
));
System.out.println(
"iso-8859-1(3) : "
+
new
String(word.getBytes(
"iso-8859-1"
),
"x-windows-949"
));
System.out.println(
"iso-8859-1(4) : "
+
new
String(word.getBytes(
"iso-8859-1"
),
"utf-8"
));
System.out.println(
"euc-kr(1) : "
+
new
String(word.getBytes(
"euc-kr"
),
"ksc5601"
));
System.out.println(
"euc-kr(2) : "
+
new
String(word.getBytes(
"euc-kr"
),
"utf-8"
));
System.out.println(
"euc-kr(3) : "
+
new
String(word.getBytes(
"euc-kr"
),
"x-windows-949"
));
System.out.println(
"euc-kr(4) : "
+
new
String(word.getBytes(
"euc-kr"
),
"iso-8859-1"
));
System.out.println(
"ksc5601(1) : "
+
new
String(word.getBytes(
"ksc5601"
),
"euc-kr"
));
System.out.println(
"ksc5601(2) : "
+
new
String(word.getBytes(
"ksc5601"
),
"utf-8"
));
System.out.println(
"ksc5601(3) : "
+
new
String(word.getBytes(
"ksc5601"
),
"x-windows-949"
));
System.out.println(
"ksc5601(4) : "
+
new
String(word.getBytes(
"ksc5601"
),
"iso-8859-1"
));
System.out.println(
"x-windows-949(1) : "
+
new
String(word.getBytes(
"x-windows-949"
),
"euc-kr"
));
System.out.println(
"x-windows-949(2) : "
+
new
String(word.getBytes(
"x-windows-949"
),
"utf-8"
));
System.out.println(
"x-windows-949(3) : "
+
new
String(word.getBytes(
"x-windows-949"
),
"ksc5601"
));
System.out.println(
"x-windows-949(4) : "
+
new
String(word.getBytes(
"x-windows-949"
),
"iso-8859-1"
));
또는 다음과 같은 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
111
String s =
"확인할문자열"
;
byte
[] BOM =
new
byte
[
4
];
BOM = s.getBytes();
if
( (BOM[
0
] &
0xFF
) ==
0xEF
&& (BOM[
1
] &
0xFF
) ==
0xBB
&& (BOM[
2
] &
0xFF
) ==
0xBF
)
System.out.println(
"UTF-8"
);
else
if
( (BOM[
0
] &
0xFF
) ==
0xFE
&& (BOM[
1
] &
0xFF
) ==
0xFF
)
System.out.println(
"UTF-16BE"
);
else
if
( (BOM[
0
] &
0xFF
) ==
0xFF
&& (BOM[
1
] &
0xFF
) ==
0xFE
)
System.out.println(
"UTF-16LE"
);
else
if
( (BOM[
0
] &
0xFF
) ==
0x00
&& (BOM[
1
] &
0xFF
) ==
0x00
&&
(BOM[
0
] &
0xFF
) ==
0xFE
&& (BOM[
1
] &
0xFF
) ==
0xFF
)
System.out.println(
"UTF-32BE"
);
else
if
( (BOM[
0
] &
0xFF
) ==
0xFF
&& (BOM[
1
] &
0xFF
) ==
0xFE
&&
(BOM[
0
] &
0xFF
) ==
0x00
&& (BOM[
1
] &
0xFF
) ==
0x00
)
System.out.println(
"UTF-32LE"
);
else
System.out.println(
"EUC-KR"
);
인코딩을 찾아서 new String 으로 변환 해도 제대로된인코딩이 안될경우
혹은 euc-kr 문자열 인코딩을 위해서 사용 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import
java.io.UnsupportedEncodingException;
/**
* @author Revfactory
*/
public
class
CharEncoding {
public
static
String encode(String str, String charset) {
StringBuilder sb =
new
StringBuilder();
try
{
byte
[] key_source = str.getBytes(charset);
for
(
byte
b : key_source) {
String hex = String.format(
"%02x"
, b).toUpperCase();
sb.append(
"%"
);
sb.append(hex);
}
}
catch
(UnsupportedEncodingException e) { }
return
sb.toString();
}
public
static
String decode(String hex, String charset) {
byte
[] bytes =
new
byte
[hex.length()/
3
];
int
len = hex.length();
for
(
int
i =
0
; i < len ;) {
int
pos = hex.substring(i).indexOf(
"%"
);
if
(pos ==
0
) {
String hex_code = hex.substring(i+
1
, i+
3
);
bytes[i/
3
] = (
byte
)Integer.parseInt(hex_code,
16
);
i +=
3
;
}
else
{
i += pos;
}
}
try
{
return
new
String(bytes, charset);
}
catch
(UnsupportedEncodingException e) { }
return
""
;
}
public
static
String changeCharset(String str, String charset) {
try
{
byte
[] bytes = str.getBytes(charset);
return
new
String(bytes, charset);
}
catch
(UnsupportedEncodingException e) { }
return
""
;
}
}
해당 클래스를 사용 하면 된다. 출처 : http://revf.tistory.com/84
1
2
3
4
5
6
7
8
9
10
11
12
13
14
String source =
"게임"
;
System.out.println(source);
String hex_utf8 = CharEncoding.encode(source,
"UTF-8"
);
System.out.println(hex_utf8);
System.out.println(CharEncoding.decode(hex_utf8,
"UTF-8"
));
String hex_euckr = CharEncoding.encode(source,
"EUC-KR"
);
System.out.println(hex_euckr);
System.out.println(CharEncoding.decode(hex_euckr,
"EUC-KR"
));
System.out.println(CharEncoding.changeCharset(source,
"UTF-8"
));
System.out.println(CharEncoding.changeCharset(source,
"EUC-KR"
));
접기
더보기 접기
JAVA 한글 깨질경우 인코딩 확인하기
String originalStr = "Å×½ºÆ®" ; // 테스트
String [] charSet = { "utf-8" , "euc-kr" , "ksc5601" , "iso-8859-1" , "x-windows-949" };
for ( int i = 0 ; i < charSet . length ; i ++) {
for ( int j = 0 ; j < charSet . length ; j ++) {
try {
System . out . println ( "[" + charSet [ i ] + "," + charSet [ j ] + "] = " + new String ( originalStr . getBytes ( charSet [ i ]), charSet [ j ]));
} catch ( UnsupportedEncodingException e ) {
e . printStackTrace ();
}
}
}
접기