문자셋과 인코딩
오픈소스 비즈니스 컨설팅 사이트는 모든 사람이 동참하는 개방된 사이트 입니다.
오픈 소스와 오픈 API와 관계된 사항은 자유로이 추가, 수정 하셔도 됩니다. 모두의 동참을 바랍니다.
오픈소스 비즈니스 컨설팅에 대한 문의는
으로 메일 주세요.
오픈 소스와 오픈 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 확인
- WEB/WAS에서 JSP 파일이 UTF-8인 환경에서 인코딩을 확인한다. (Media:ChkEncoding.zip)
- 첨부된 zip 파일을 다운로드하여 압축을 풀어 UTF-8 인코딩으로 작성된 ChkEncoding.jsp 파일을 생성한다.
- ChkEncoding.jsp 파일을 WEB/WAS의 Document Root 디렉토리로 복사한다.
- ChkEncoding.jsp을 실행하여 UTF-8 환경에서 정상적으로 처리되는 인코딩을 확인한다.
- WEB/WAS에서 JSP 파일이 KSC5601인 환경에서 인코딩을 확인한다. (Media:ChkEncodingKo.zip)
- 첨부된 zip 파일을 다운로드하여 압축을 풀어 KSC5601 인코딩으로 작성된 ChkEncodingKo.jsp 파일을 생성한다.
- ChkEncodingKo.jsp 파일을 WEB/WAS의 Document Root 디렉토리로 복사한다.
- ChkEncodingKo.jsp을 실행하여 KSC5601 환경에서 정상적으로 처리되는 인코딩을 확인한다.
[편집] 다양한 환경에서 인코딩 설정
[편집] 웹 브라우져 설정
- "도구 -> 인터넷 옵션 -> 언어" 메뉴를 선택한다.
- 영어[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 설정
- Tomcat 인코딩 설정
- UTF-8 Charset을 위해 Tomcat의 Java 환경을 설정한다.
- "Apache Tomcat Properties" 창에서 "Java" 탭을 선택한다.
- Java Options에 다음을 추가한다.
-Dfile.encoding=8859_1 -Dfile.client.encoding=8859_1 -Dclient.encoding.override=8859_1
- 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 글꼴 |
|
| 타입3 글꼴 |
|
| 트루타입 글꼴 |
|
| 타입42 글꼴 |
|
| 메타 글꼴 |
|
| 글꼴 족 |
|
[편집] 무료 글꼴
| 글꼴 | 설명 |
| 나눔고딕 코딩글꼴 |
|
| 네이버 나눔 글꼴 |
|
- 글꼴 모음
- 나눔고딕 코딩 글꼴
- 네이버 나눔글꼴
- 또 하나의 무료 한글 폰트, 렉시 굴림
- 앗! 무료 한글 폰트가 이렇게 많다니!!! 2 : 28종류의 무료 글꼴 소개
- 130종 이상의 무료 한글 폰트 받기

