문자셋과 인코딩의 정의

  • 문자셋 (charset, Character Set)
하나의 언어권에서 사용하는 언어를 표현하기 위한 모든 문자(활자)의 모임을 문자셋(charater set)이라고 한다. 다시 말하면 우리가 얘기하는 언어를 책으로 출판할 때 필요한 문자(활자)를 모두 모은 것이라고 생각하면 된다. 추가적으로 부호와 공백 등과 같은 특수 문자도 문자셋에 포함된다.
영어의 경우 알파벳 대소문자와 특수 문자 등으로 간단하게 문자셋을 구성할 수 있지만 한글의 경우 출판에서 가,나,다 등으로 출판함으로 훨씬 다양한 문자셋을 가지고, 또한 한자를 병행해서 사용함으로 문자셋의 범위는 더욱 넓어진다.
  • 추상적인 글자 셋은 여러 개의 인코딩을 가질 수 있다.
  • MIME 문자셋은 IANA에서 정의하며 인터넷 및 XML 파일에서 사용한다.
  • 인코딩 (encoding)
인코딩은 문자셋을 컴퓨터가 이해할 수 있는 바이트와 매핑하는 규칙이다. 예를 들면 ASCII Code에서 A,B,C 등은 문자셋이고 A는 코드 65, B는 코드 66 등 바이트 순서와 매핑한 것이 인코딩이다. 따라서 문자셋을 어떻게 매핑하느냐에 따라 하나의 문자셋이 다양한 인코딩을 가질 수 있다.
  • 추상적인 문자셋을 구체적인 bit-stream으로 표기하는 방법
  • 여러가지 문자셋을 동시에 표시할 수 있다.
  • 대부분의 인코딩에서는 대소문자를 구분하지 않는다.
  • 대한민국 문자셋(charater set)에서 가장 많이 사용하는 인코딩은 "UTF-8", "KSC5601", "ISO-8859-1" 이다.
  • 문자셋(인코딩)의 예
  • 한글 : 8bit KSC5601 (8bit EUC-KR, 7bit ISO-2022-KR, ISO-2022-Int)
  • 영문 : KSC5636, US-ASCII (둘 간의 차이는 화페 단위 뿐)
  • 한글+영문 : KSC5861 (EUC-KR), KSC5636 + KSC5601를 모두 포함한다.
  • 유니코드 : 4byte Unicode < ISO-10646 UCS (ISO-8859-1, UTF-8, UTF-16)

문자셋과 인코딩은 동일한 명칭을 가질 수 있어 서로 혼용하여 사용되는 경우가 많다.
EUC-KR은 원래 유닉스용 표준이었는데 인터넷으로 확장되어 사용된다.
KSC5601은 인터넷에서 원활한 한글(완성형) 사용을 위하여 정의된 표준이다.
EUC (Extended UNIX Code), UTF (UCS Transformation format)

기본 인코딩

  • Windows : 시스템 언어와 관련된 코드 페이지를 따름
    • 영문 Windows는 CP1252 인코딩을 사용
    • 한글 Windows는 MS949 인코딩을 사용
  • Unix : LANG 환경 변수로 지정된 로케일에 해당하는 인코딩
    • Solaris는 LANG 환경 변수가 ko, ko_KR일 경우 EUC-KR 인코딩을 사용
    • HP는 LANG 환경 변수가 ko_KR, ko_KR.eucKR일 경우 EUC-KR 인코딩을 사용
    • Unix에서 locale -a 명령을 사용하여 LANG 환경 변수에 지정 가능한 문자셋을 확인할 수 있다.
  • HTML : ISO-8859-1와 ISO-10646
  • XML : UTF-8
  • 웹 브라우져 : 내부적으로 모두 유니코드로 처리를 한다.
  • HTTP/1.0 : ISO-8859-1
  • HTTP (URL,URI) : US-ASCII, %hexadecimal_code, JavaScript escape() 함수 사용
  • Java : 유니코드 2.0
  • 직렬화된 Java Class : UTF-8
  • J2EE : ISO-8859-1
  • Oracle : UTF-8 (AL32UTF8), 한국에서는 KSC5601 (KO16KSC5601)




다양한 환경에서 인코딩 설정

웹 브라우져 설정

  1. "도구 -> 인터넷 옵션 -> 언어" 메뉴를 선택한다.
  2. 영어[en]와 한국어[ko]를 추가하고 원하는 언어를 가장 상단에 위치한다.

JVM 설정

  • 일반적으로 LANG 환경 변수를 설정해 주면 자동으로 설정이 된다.
locale -a                               Solaria unix 명령어로 지원 가능한 encoding을 확인한다.

env LANG ko csh에서 Encoding을 설정한다. (KSC5601, EUC-KR)

LANG=ko ksh에서 Encoding을 설정한다. (KSC5601, EUC-KR)

  • JVM 옵션 설정 (UTF-8, ISO-8859-1, KSC5601)
-Dfile.encoding=8859_1                  필수 항목

-Dfile.client.encoding=8859_1

-Dclient.encoding.override=8859_1 JVM 버전에 따라 (사용안함)

  • JSP를 사용하여 JVM 옵션 확인 (encoding.jsp)
file.encoding = <%= System.getProperty("file.encoding") %><br>

file.client.encoding = <%= System.getProperty("file.client.encoding") %><br>

client.encoding.override = <%= System.getProperty("client.encoding.override") %><br>

HTML 설정

HTML 파일을 UTF-8로 만들어 저장한다.

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

XML 설정

XML 파일을 UTF-8로 만들어 저장한다.

<?xml version="1.0" encoding="UTF-8" ?>

JSP 설정

JSP 파일을 UTF-8로 만들어 저장한다.

<%@ page pageEncoding="UTF-8" %>

<%@ page contentType="text/html;charset=UTF-8" %>

Servlet 설정

HTTP 요청의 인코딩 지정

request.setCharacterEncoding("UTF-8");

HTTP 응답의 인코딩 지정

response.setContentType("text/html; charset=UTF-8");

web.xml 설정

<mime-mapping>

<extension>html</extension>

<mime-type>text/html;charset=UTF-8</mime-type>

</mime-mapping>

Default Oracle Database 문자셋

  • Default Oracle Database 문자셋 : UTF-8 (AL32UTF8), 한국에서는 KSC5601 (KO16KSC5601)
  • AL32UTF8, KO16KSC5601 (KSC5601), WE8ISO8859P1 (8859_1)
  • Default Oracle Database 문자셋 확인 방법
sqlplus system/manager


select parameter || ' : ' || value parameter_value

from NLS_DATABASE_PARAMETERS

where parameter = 'NLS_CHARACTERSET'

or parameter = 'NLS_NCHAR_CHARACTERSET';


select name || ' : ' || substr(value$, 1, 40) parameter_value

from sys.props$

where name = 'NLS_CHARACTERSET';


select parameter || ' : ' || value parameter_value

from NLS_INSTANCE_PARAMETERS, V$NLS_PARAMETERS, NLS_SESSION_PARAMETERS;

  • Oracle Database 문자셋 변경 방법
환경 변수 또는 %ORACLE_HOME%/dbs/init[SID].ora 을 설정한다.
NLS_LANG='American_America.Ko16ksc5601'

ORA_NLS33='$ORACLE_HOME/ocommon/nls/admin/data'

NLS_DATE_FORMAT='YYYY-MM-DD'

  • DriverManager에서 문자셋 설정 방법
java.util.Properties props = new java.util.Properties();

props.put("charSet", "KSC5601" );

DriverManager.getConnection(dbUrl, props);



'LINUX_UNIX' 카테고리의 다른 글

ubunutu - jdk 설치  (0) 2014.06.02
[ubuntu] 하드웨어 정보 보기  (0) 2011.06.02
CharacterSet 과 Encoding  (0) 2011.01.28
터미널에서 한글 깨짐.  (0) 2011.01.11
linux 한글패치된 unzip 5.52  (0) 2011.01.11
kill 프로세스명 찾아서 강제로 죽이기  (0) 2011.01.06
보통 토드에서
한글이 제대로 나오지 않는 경우,
검색을 해보면,
레지스트리에서 NLS_LANG 값을 수정하거나
내컴퓨터-고급설정-환경변수 에서 NLS_LANG 을 추가해서 값을 넣어주거나 하라고 한다.

DB마다 케릭터셋이 다른 DBMS 에 접속이 자주 있으면 이거 역시 짜증나는 일이다.

cmd 파일을 만들어서 사용하면 그나마 편리하다;

@ECHO OFF
TITLE US7ACII - TOAD
SET NLS_LANG=KOREAN_KOREA.KO16MSWIN949
"C:\Program Files\Quest Software\Toad for Oracle\toad.exe"




http://cafe.naver.com/toadsoft.cafe 토드 네이버 카페에 질문을 올렸는데

답변해주신 "해븐"님 감사.

출처 : http://blog.naver.com/seogi1004?Redirect=Log&logNo=110045319589

정리를 한번 한다 한다 하면서 필요할 때마다 찾아다니다가,
어떤분이 잘 정리를 해주셔서.. 살짝 가져왔습니다. (닉: 문학이?)
출처 표기하고 내용은 변경하지 않았습니다만, 그냥 약간 편집만 했습니다.

1. DB charset 설정

2. Server charset 설정

   예) Tomcat 의 경우 server.xml 파일에 (링크)
        <connector .....   부분에
        useBodyEncodingForURI="true"  
        나
        URIEncoding="UTF-8"
        를 추가한다.

        확인하진 않았지만 위는 문서 인코딩 형태에 따라 URI 형식을 바꾸는 것 같고,
        아래는 URI 인코딩 형식을 무조건 정해주는 것 같다.

    이러면 POST 방식에서의 charset 해결


3.  GET 방식을 위해 jsp 의 경우

    한글 URL이 문제가 될 경우 
     java.net.URLEncoder.encode( "한글파일.html" ,  "UTF-8" );


4. 개발 툴에서 문서 자체의 인코딩 방식 변경.

    editplus : 기본설정 - 파일 >> 기본인코딩 UTF-8
    eclipse : window - preferences - general - workspace - textfile Encoding


5. 작업문서에서의 설정

① 페이지 설정

UTF-8을 쓰고자 하는 경우 *.html, *.htm, *.jsp 파일은 UTF-8 형식으로 저장한다.

EUC-KR, MS949는 ANSI, MS949등의 기본 형식으로 저장하면 된다.

 

모든 HTML, JSP에는 아래와 같은 META태그를 넣을 것을 권장한다.

<META HTTP-EQUIV="contentType" CONTENT="text/html;charset=UTF-8">

<!--EUC-KR인 경우 UTF-8을 EUC-KR로 바꾼다-->

JSP에서는 페이지 상단에 page 지시자를 다음과 같이 넣는다.

<%@ page contentType="text/html;charset=UTF-8" %>

<!--EUC-KR인 경우 UTF-8을 EUC-KR로 바꾼다-->

② POST 방식의 데이터 전송

POST방식으로 전송된 데이터는 UTF-8이든, EUC-KR이든 다음과 같은 라인을 추가하면 해결 된다.

request.setCharacterEncoding("UTF-8");

//EUC-KR인 경우 UTF-8을 EUC-KR로 바꾼다.

③ GET 방식의 데이터 전송

GET 방식으로 전송된 데이터는 URL을 통해 전송되기 때문에 위의 방식으론 쓸 수 없다. URL에서의 데이터를 Latin-1(8859_1)인코딩으로 서버에서 처리하기 때문이다. 이를 톰캣의 버그라고 단정짓는 일부 서적의 말은 잘못된것이다.

 

불러온 데이터를 아래와 같이 처리해 주어야 한다.

request.setCharacterEncoding("UTF-8");

String data = new String(request.getParameter("data").getBytes("8859_1"),"UTF-8");

//Latin-1(8859_1)로 읽어들인 데이터를 다시 UTF-8로 재해석하는 코드

//EUC-KR인 경우  UTF-8을 EUC-KR로 바꾼다.

④ 한글 파일 전송

Latin-1(8859_1)로 세팅된 톰캣 서버에서는 URL을 무조건 영어로 처리하므로 한글 파일은 절대로 읽어들일 수 없다. 파일을 영어로 바꾸어 저장하거나, 한글 파일을 영어로 바꾸는 처리를 해주어야 한다.

⑤ DB URL의 인코딩

jdbc:mysql://localhost:3306/DB명?useUnicode=true&characterEncoding=utf8              [ Java 또는 JSP ]

jdbc:mysql://localhost:3306/DB명?useUnicode=true&amp;characterEncoding=utf8       [ XML ]

 

XML 문서에서는 기호 ('&')를 표시할 때 &amp;를 사용하기 때문에 일반 코드와 다르다.




출처 : http://blog.naver.com/seogi1004?Redirect=Log&logNo=110045319589

출처의 닉:  문학이 님 감사^^

'JAVA/JSP' 카테고리의 다른 글

class 파일의 컴파일 버전 확인하기.  (3) 2011.04.08
ResultSet 의 Null 체크.  (0) 2011.03.31
개발 초기에 charset 맞추기.  (0) 2010.11.25
StringBuffer 초기화하여 재사용하기.  (0) 2010.11.22
ResultSet -> LIST  (0) 2010.11.03
java charset 관련 변환 유틸.  (0) 2010.10.21

+ Recent posts