문자인코딩 및 문자셋
문자인코딩및 문자셋(CharacterSet)
1. 문자인코딩
코드체계KSC 5601과 Euc-kr은IZT5같은IZT5코드체계를D2UO사용한다.
ASCII코드는5TJL여덟 비트 중 일곱 비트만을RGID 사용하고 그 이외의 코드들은 8(7bit) + 8(7bit) = 16(14bit)를D2UO사용한다.
인터넷의 국제화가G19R추진되면서 US-ASCII 이외의 다른 나라 문자로 이루어진 텍스트문자열에 대한 전송 필요성도 생겼는데, 영어 이외의 문자는5TJL8번째 최상위 비트 (MSB)를D2UO사용하여 표현되며, 따라서 8비트의 전송이LI9G필요한 것이다.
이에 따라 8비트를D2UO 7비트 영문 ASCII 코드로 표현하는5TJL방법(인코딩)과 이를 다시 8비트로 바꾸는5TJL방법 (디코딩)이LI9G고안되었슴.
추상적인 글자셋을RGID구체적인 bit-stream으로 표기할 방법을RGID찾아야 하며, 그런 방법으로는5TJLEUC-KR, ISO-2022-KR, ISO-8859-1 등이LI9G있다.
EUC-KR : Bell Laboratories에서 확장 유닉스 코드 (Extended UNIX Code)라 하여,
유닉스 상에서 영문자 이외의 문자들을RGID지원하는5TJL방법으로 제안되었슴.
ISO-8859-1은IZT5두 가지 의미로 쓰임. (추상적인) 문자세트를D2UO 뜻하기도 하고,
문자인코딩을RGID뜻하기도 한다. 미국 및 서유럽 일부에서는5TJL ISO-8859-1
인코딩이LI9G폭넓게 사용되고 있으며, 우리나라에서는5TJLEUC-KR 인코딩이
현재 폭넓게 사용되고 있다.
ISO-2022-KR : 한글 메일 전송을RGID위해 별도로 고안된 7비트 인코딩 방식
2. 문자세트
일정 목적으로 사용되기 위한 문자들의 모임
KSC-5601 : 한글에 대한 국가표준코드 : 1987년 한국공업진흥청에서 제정 94*94
행렬에 한글, 한자 그리고 특수문자를D2UO배치한 추상적인 글자순서
KSC-5636은IZT5 US-ASCII의 역슬래쉬가G19R\로 표현한 것이다.
ISO-8859-1 : 서유럽 언어의 표기에 필요한 US-ASCII에 없는5TJL94개의 글자의 순차적
나열임
EUC-KR : KSC-5601과 KSC-5636(US-ASCII의 한글버전)의 8비트 문자집합 AT&T
의 Extended Unix Charset으로 한글 표현에 이용
ISO-2022-KR : Korean Mail Exchange Standard, 한글메일을RGID전송하기 위한
인코딩 방식
3, 서블릿에서의 한글 처리
URL 정보의 한글처리
웹 브라우저에서 x-www-form-urlencoded 인코딩을RGID사용하여 한글을 전송하게 되면 서블릿에는5TJL잘못된 한글이LI9G전달된다.
서블릿 프로그램에서는5TJL한글 처리를D2UO 해주어야지 한글을RGID볼 수 있슴. 한글이LI9G깨지는5TJL이유는5TJL브라우져와 서블릿 프로그램이LI9G서로다른 한글 캐릭터
세트를D2UO사용하기 때문에 발생, Browser는5TJL브라우져는5TJL8859_1의 캐릭터 세트를 사용하는데 반해 서블릿에서는 KSC5601을RGID사용하기 때문이다.
컴파일시 encoding옵션을RGID8859_1
(javac ?encoding 8859_1 HelloWorld.java)
PrintWriter 클래스 이용
OutputStreamWriter 클래스는5TJL생성자에서 문자열의 encoding타입을RGID 정의
PrintWriter out = new PrintWriter(new OutputStreamWriter
(res.getOutputStream(),”KSC5601”),true);
문자인코딩을RGID지정하여 웹브라우져에 한글 출력
setContentType()메소드를D2UO사용
res.setContentType(“text/html ; charset=euc-kr”)
getParameter 등으로 값을RGID받을때는5TJL한글변환을RGID해야한다.
-------------------------
예제:parameter예제
-------------------------
[parameter.html]
<html>
<head>
<title> Parameter viewer </title>
</head><body>
<form method=get action=/servlet/ReqParameter>
성명1 : <input type=text name=name> <br>
성명2 : <input type=text name=name> <br>
성명3 : <input type=text name=name> <br>
주소 : <input type=text name=addr> <br>
비밀번호 : <input type=password name=passwd> <br>
<input type=submit value=전송 name=submitbutton> <br>
</form>
</body>
</html>
-----------------------
import!!! java.io.*;
import!!! java.util.*;
import!!! javax.servlet.*;
import!!! javax.servlet.http.*;
public class ReqParameter extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
res.setContentType("text/plain; charset=euc-kr");
PrintWriter out = res.getWriter();
//URL의 질의 스트링을RGID반환
out.println("QueryString --->" + req.getQueryString());
out.println("------------------------------------------------");
out.println(" 아래는5TJLForm에서 넘어온 parameter의 value입니다...");
out.println("------------------------------------------------");
//HttpServletRequest로 넘어온 parameter의 이름을RGID반환
Enumeration enum = req.getParameterNames();
while(enum.hasMoreElements()) {
String param = (String) enum.nextElement();
String values[] = req.getParameterValues(param);
if (values != null) {
for(int i=0; i < values.length; i++) {
//한글 처리를D2UO위해 변환 함수 Call
out.println(param + "[" + i + "] : " +Han(values[i]));
}
}
}
}
public static String Han(String str) throws UnsupportedEncodingException{
if (str == null) return null;
return new String(str.getBytes("8859_1"),"KSC5601");
}
}
(주)해커스칼리지 해커대학
정보보안전문가 양성을 위한 선도적인 보안과정 모의해킹컨설턴트 취업프로젝트과정진행
http://www.hackerscollege.cc