문자셋과 인코딩

오픈소스 비즈니스 컨설팅 사이트는 모든 사람이 동참하는 개방된 사이트 입니다.
오픈 소스와 오픈 API와 관계된 사항은 자유로이 추가, 수정 하셔도 됩니다. 모두의 동참을 바랍니다.
오픈소스 비즈니스 컨설팅에 대한 문의는 으로 메일 주세요.

오픈소스 비즈니스 컨설팅

문자셋과 인코딩에 대해 설명하고 다양한 환경에서 한글 문제에 대한 해결책을 제시한다.
우리나라도 이제 국제화에 눈을 떠서 다양한 언어를 지원해야 하므로 UTF-8을 기준으로 하여 작성한다.

목차

[편집] 문자셋과 인코딩

[편집] 문자셋과 인코딩의 정의

  • 문자셋 (charset, Character Set)
하나의 언어권에서 사용하는 언어를 표현하기 위한 모든 문자(활자)의 모임을 문자셋이라고 한다. 다시 말하면 우리가 얘기하는 언어를 책으로 출판할 때 필요한 문자(활자)를 모두 모은 것이라고 보면 된다. 그러므로 부호와 공백 등과 같은 특수 문자도 문자셋에 포함된다.
영어의 경우 알파벳 대소문자와 특수 문자 등으로 간단하게 문자셋을 구성할 수 있지만 한글의 경우 출판에서 가나다 등으로 출판으로 함으로 훨씬 다양한 문자셋을 가진고 또한 한자를 병행해서 사용함으로 문자셋의 범위는 더욱 넓어진다.
  • 추상적인 글자 셋으로 여러개의 인코딩을 가질 수 있다.
  • MIME 문자셋은 IANA에서 정의하며 인터넷 및 XML 파일에서 사용한다.
  • 인코딩 (encoding)
인코딩은 문자셋을 컴퓨터가 이해할 수 있는 바이트와의 매핑 규칙이다. 예를 들면 ASCII Code에서 ABC 등은 문자셋이고 A는 코드 65, B는 코드 66 등 바이트 순서와 매핑한 것이 인코딩이다. 따라서 문자셋을 어떻게 매핑하느냐에 따라 하나의 문자셋이 다양한 인코딩을 가질 수 있다.
  • 추상적인 문자셋을 구체적인 bit-stream으로 표기하는 방법
  • 여러가지 문자셋을 동시에 표시할 수 있다.
  • 대부분의 인코딩에서는 대소문자를 구분하지 않는다.
  • 대한민국에서 가장 많이 사용하는 인코딩은 "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 환경 변수에 지정 가능한 문자셋을 확인할 수 있다.
  • ksh 환경에서 환경 변수 설정 예
LANG=ko_KR.utf8
export LANG
  • csh 환경에서 환경 변수 설정 예
set LANG ko_KR.utf8
setenv LANG ko_KR.utf8
  • 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)

웹 서비스 표준 인코딩과 포탈에서 필요한 인코딩

[편집] Java에서 Encoding 확인

  1. 첨부된 zip 파일을 다운로드하여 압축을 풀어 UTF-8 인코딩으로 작성된 ChkEncoding.jsp 파일을 생성한다.
  2. ChkEncoding.jsp 파일을 WEB/WAS의 Document Root 디렉토리로 복사한다.
  3. ChkEncoding.jsp을 실행하여 UTF-8 환경에서 정상적으로 처리되는 인코딩을 확인한다.
  1. 첨부된 zip 파일을 다운로드하여 압축을 풀어 KSC5601 인코딩으로 작성된 ChkEncodingKo.jsp 파일을 생성한다.
  2. ChkEncodingKo.jsp 파일을 WEB/WAS의 Document Root 디렉토리로 복사한다.
  3. ChkEncodingKo.jsp을 실행하여 KSC5601 환경에서 정상적으로 처리되는 인코딩을 확인한다.

[편집] 다양한 환경에서 인코딩 설정

[편집] 웹 브라우져 설정

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

[편집] JVM 설정

  • 일반적으로 LANG 환경 변수를 설정해 주면 자동으로 설정이 된다.
locale -a         Solaria unix 명령어로 지원 가능한 encoding을 확인한다.
set  LANG  ko     csh에서 Encoding을 설정한다. (KSC5601, EUC-KR)
setenv  LANG  ko
LANG=ko           ksh에서 Encoding을 설정한다. (KSC5601, EUC-KR)
export LANG
  • 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);

[편집] PHP

지금은 국제화 시대이므로 UTF-8을 기준으로 한글 설정을 한다. 아래 자료는 PHP 5.2.8을 기준으로 작성 되었다.

  • PHP에서 한글화를 위해 필요한 모듈
  • iconv
  • mbstring


  • $PHP_HOME/php.ini 에서 다음과 같이 수정 한다.
[PHP]
default_charset = "UTF-8"
magic_quotes_gpc = Off
output_buffering = 4096
output_handler = mb_output_handler

[mbstring]
mbstring.language = UTF-8
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none;

[PHP_MBSTRING]
extension=php_mbstring.dll

[편집] Perl

[편집] Python

  • UTF-8을 기준으로 하여 Python 파일(~.py)에서 한글 설정
  • Python 파일(~.py)을 UTF-8 형태로 저장 한다.
  • "# -*- coding: utf-8 -*-" 문자열을 Python 파일(~.py) 최상단에 배치 한다.

[편집] 서비스에서 인코딩 설정

[편집] MySQL에서 UTF-8 설정

  • 다중 언어를 지원하기 위해서 UTF-8 charset을 설정한다.
  • MySQL이 설치된 홈디렉토리에 있는 my-medium.ini 파일을 복사하여 my.ini 파일을 생성한다.
  • my.ini 파일에 아래 사항을 추가 또는 수정한다.
[mysql]   
default-character-set=utf8

[mysqld]   
character-set-client-handshake=FALSE  
init_connect="SET collation_connection=utf8_general_ci"  
init_connect="SET NAMES utf8"  
default-character-set=utf8  
character-set-server=utf8  
collation-server=utf8_general_ci  

[client]    
default-character-set=utf8  

[mysqldump]    
default-character-set=utf8


  • "MySQL Administrator -> Tools -> MySQL Command Line Client"에서 다음 명령을 사용하여 인코딩을 확인한다.
show variables like "%char%";
show variables like "%collation%";
  • PHP 연동시 한글 설정
$dbconn = mysql_connect("localhost", "root", "암호");
$dbselect = mysql_select_db("your_db_name", $dbconn);
mysql_query("set names euckr;");  //--- DB가 KSC5601일 경우
mysql_query("set names utf8;");   //--- DB가 UTF-8일 경우

[편집] Tomcat에서 UTF-8 설정

  • "Apache Tomcat Properties" 창에서 "Java" 탭을 선택한다.
  • Java Options에 다음을 추가한다.
-Dfile.encoding=8859_1
-Dfile.client.encoding=8859_1
-Dclient.encoding.override=8859_1
ppp
  • "적용" 버튼을 눌러 변경 사항을 적용한다.


  • UTF-8 Charset을 위해 Tomcat 환경을 설정한다.
%TOMCAT_HOME%/conf/server.xml에서 Connector 정보에 URIEncoding="UTF-8"를 추가한다.
<Connector port="8080" protocol="HTTP/1.1" 
 connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
<Connector port="8009" protocol="AJP/1.3" 
 redirectPort="8443" URIEncoding="UTF-8" />


  • Tomcat Connectors를 사용하여 Apache HTTP Server와 Apache Tomcat을 연동할 경우 환경 설정
  • mod_jk.conf 설정 파일에서 다음 옵션을 추가 한다.
JkOptions +ForwardURICompatUnparsed

[편집] 터미널에서 한글 설정

  • Telnet으로 Unix 사용시 한글이 보이나 입력이 안될 경우 설정
stty -istrip -parenb cs8
  • 언어 설정 확인
#--- 사용 가능한 언어를 확인한다.
locale -a
env | grep LANG

[편집] Ubuntu Server 한글 설정

  • vi /etc/default/locale
LANG="ko_KR.UTF-8"

[편집] CentOS 한글 설정

  • vi /etc/sysconfig/i18n
LANG="ko_KR.UTF-8"

[편집] 인코딩 관련 Utility

[편집] JVM을 이용한 파일 코드 변환

EUC-KR 파일(file.euc_kr)을 UTF-8 파일(file.utf8)로 변환한다.

native2ascii -encoding EUC_KR  file.euc_kr  file.tmp
native2ascii -reverse -encoding UTF8  file.tmp  file.utf8

[편집] iconv를 사용한 파일 코드 변환

  • index.hhc 파일을 UTF-8에서 CP949로 변환할 경우
iconv -f UTF-8 -t CP949 index.hhc > index.cp949

[편집] 파일 코드 변환

일반적으로 사용하는 인코딩 : "UTF-8", "KSC5601", "ISO-8859-1"

//--- Java 함수
public boolean encodingFile(String encodeFr, String encodeTo) 
       throws IOException
{
    InputStreamReader  inp = 
        new InputStreamReader(System.in, encodeFr);
    OutputStreamWriter out = 
        new OutputStreamWriter(System.out, encodeTo);

    for (int ch;(ch = inp.read()) != -1;) {
        out.write(ch);
        if (ch == 0xfffd)   {
            //--- 오류 : 유니코드로 표현할 수 없는 문자임
            inp.close();
            out.close();
            return false;
        }
     }
    out.close();
    inp.close();
    return true;
}

[편집] Java에서 코드 변환

public static String encoding(String str, String encodeFr, 
                              String encodeTo)
{
    try {
        return new String(str.getBytes(encodeFr), encodeTo);
    } catch(Exception ex)   {
        return str;
    }
}

public static String java2db(String str)
{
    return encoding(str, "ISO-8859-1", "KSC5601");
}

public static String db2java(String str)
{
    return encoding(str, "KSC5601", "ISO-8859-1");
}

[편집] Applet을 사용한 한글 parameter 전달 방법

  • Encoder.java라는 Applet을 작성한다.
    • 웹서버 홈 디렉토리 아래에 applets 폴더를 만든다.
    • Encoder.java를 컴파일한 Encoder.class 파일을 applets 폴더에 위치한다.
import java.applet.Applet;
import java.net.URLEncoder;

public class Encoder extends Applet
{
    public Encoder()
    {
    }

    public void init()
    {
    } 

    public String encode(String s)
    {
        return URLEncoder.encode(s);
    }
}
  • HTML에서 Applet을 사용하여 한글 parameter를 전달한다.
  • HTML에 다음과 같이 Applet을 포함한다.
<applet id="Encoder" name="Encoder" codebase="/applets" 
 code="Encoder.class" width="0" height="0" MAYSCRIPT>
</applet>
<script type="text/JavaScript">
function URLEncode(str)
{	
    return window.document.all["Encoder"].encode(str);
}
</script>
  • JavaScript에서 Applet을 사용하여 한글을 encoding하여 전달한다.
예) window.document.location.href = 
        "/test.jsp?name=" + URLEncode("한글");
  • 서버의 Servlet 또는 JSP에서 전달된 Parameter를 decode하여 사용한다.
import java.net.URLDecoder;

URLDecoder.decode("전달받은 parameter");

[편집] 폰트

[편집] 글꼴의 종류

글꼴 종류 설명
비트맵 글꼴
  • 점들로 이루어진 행렬로 글꼴 표시
  • 글꼴의 크기를 바꿀 수 없으므로 특정 해상도에 따른 장치 의존적인 글꼴임
타입1 글꼴
  • Adobe에서 만든 3차 곡선을 사용한 외곽선 글꼴 (리눅스에서 많이 사용됨)
  • Adobe의 포스트스크립트, Unix(X와 고스트스크립트)에서 지원 한다.
  • 확장자 : ~.afm (Adobe Font Metric), ~.pfb (Printer Font Binary), ~.pfa (Printer Font Ascii), ~.pfm (윈도우용 포스트 스크립트 글꼴)
타입3 글꼴
  • 타입 1 글꼴과 비슷하게 afm와 pfa의 묶음으로 배포되지만 잘 쓰이지 않는다.
트루타입 글꼴
  • Apple에서 만든 2차 곡선을 사용한 외곽선 글꼴로 글꼴 시장을 장악 (윈도우즈에서 널리 사용됨)
  • 확장자 : ~.ttf (글꼴의 크기와 형태 정보를 저장)
  • 윈도우즈에서 사용이 가능하고 최근에는 Linux에서도 점차 사용할 수 있다.
타입42 글꼴
  • 헤더를 추가한 트루타입 글꼴
  • 포스트스트립트 해석기에서 사용 한다.
메타 글꼴
  • Donald E. Knuth이 조판 시스템을 위해 개발한 글꼴
  • 부드럽게 글꼴의 크기를 바꿀 수 있다.
  • 비트맵 글꼴로 번역되는 시간이 오래 걸린다.
  • 확장자 : ~.mf
글꼴 족
  • 글꼴과 변형된 글꼴의 묶음
  • 예) 기본 글꼴, 굵은 글꼴(bold), 기울인 글꼴(italic), 굵은 기울인 글꼴(bold-italic)

[편집] 무료 글꼴

글꼴 설명
나눔고딕 코딩글꼴
  • 개발자를 위한 고정폭 글꼴
네이버 나눔 글꼴
  • 2008년 한글날 네이버가 한글 사랑을 담아 제공한 글꼴
  • 나눔 고딕, 나눔 명조가 있음
  • 글꼴 모음

[편집] 참고 문헌

[편집] 오픈소스 한글화

[편집] 참고 문헌

관련 사이트