28
UNICODE Seminar – UNICODE Seminar – 한한한한 한한한한한 한한 한한한한 한한한한한 한한 2005.11.22 By bleujin

UNICODE Seminar – 한국에서 프로그래머 하기

Embed Size (px)

DESCRIPTION

UNICODE Seminar – 한국에서 프로그래머 하기. 200 5.11.22 By bleujin. Global Software?. 영역 (Territory) 별 지원. 달력 설정 방법 - 첫번째 요일 - 첫번째 주 날짜 포맷 - 05/08/10 - May.8.2005 - 中華民國 94 年 07 月 21 日 통화 기호 - W, Kč, $, Dual Currency 숫자그룹 - 2,0000.00 - 20,000.00 - 20.000,00. 1 / 26. - PowerPoint PPT Presentation

Citation preview

Page 1: UNICODE Seminar  – 한국에서 프로그래머 하기

UNICODE Seminar –UNICODE Seminar –

한국에서 프로그래머 하기한국에서 프로그래머 하기

2005.11.22By bleujin

Page 2: UNICODE Seminar  – 한국에서 프로그래머 하기

Global Global Software?Software?

1 / 261 / 26

영역영역 (Territory)(Territory) 별 지원별 지원

달력 설정 방법달력 설정 방법- - 첫번째 요일첫번째 요일- - 첫번째 주첫번째 주

날짜 포맷날짜 포맷- 05/08/10 - 05/08/10 - May.8.2005- May.8.2005- - 中華民國中華民國 9494 年年 0707 月月 2121 日 日

통화 기호통화 기호- W, Kč, $, Dual Currency- W, Kč, $, Dual Currency

숫자그룹숫자그룹- 2,0000.00- 2,0000.00- 20,000.00- 20,000.00- 20.000,00- 20.000,00

Page 3: UNICODE Seminar  – 한국에서 프로그래머 하기

Global Global Software?Software?

2 / 262 / 26

언어언어 (Language)(Language) 적 지원적 지원

캐릭터 셋캐릭터 셋- KO16MSWIN949, KO16KSC5601- KO16MSWIN949, KO16KSC5601

정렬방식정렬방식- Linguistic Sorting(KOREAN_M)- Linguistic Sorting(KOREAN_M)

날짜 표기에 사용되는 기호날짜 표기에 사용되는 기호- month, day, day of week, year- month, day, day of week, year

에러메시지 및 번역에러메시지 및 번역

Page 4: UNICODE Seminar  – 한국에서 프로그래머 하기

ExampleExample

3 / 263 / 26

ExampleExample

인코딩인코딩 , , 디코딩디코딩

Content-type in HTML, ISO-8859-1?, ISO-8859-5Content-type in HTML, ISO-8859-1?, ISO-8859-5

이메일이메일 (( 웹웹 )) 이 이 ????? ????? 보여요보여요 , , 글자가 깨졌어요글자가 깨졌어요 ....

request.getParam(“val”).getBytes(“euc-kr”), request.getParam(“val”).getBytes(“euc-kr”), (new FileWriter(“aaa.txt”)).writeln(“abc”)(new FileWriter(“aaa.txt”)).writeln(“abc”)

조합형 한글와 완성형 한글조합형 한글와 완성형 한글 ??

UTF8? Unicode? ALUTF32, UCS-2, UTF16, UTF32??? UTF7 ???UTF8? Unicode? ALUTF32, UCS-2, UTF16, UTF32??? UTF7 ???

Code947, i18n, L10NCode947, i18n, L10N

?c?c 각하각하 , , 아아 ????

NLS-Lang?? KO16MSWIN949, KO16KSC5601NLS-Lang?? KO16MSWIN949, KO16KSC5601

Page 5: UNICODE Seminar  – 한국에서 프로그래머 하기

Legend Of ASCIILegend Of ASCII 왜 왜 1byte1byte 는 는 8bit 8bit 인가인가 ??

1byte -> 8bit -> 2^8 -> 2561byte -> 8bit -> 2^8 -> 2562byte -> 16bit -> 2^16 -> 65536 2byte -> 16bit -> 2^16 -> 65536

Page 6: UNICODE Seminar  – 한국에서 프로그래머 하기

Legend Of ASCIILegend Of ASCII OEMOEM

- OEM - OEM 문자 문자 (127)(127)- Code Page (win98, cp437, cp949)- Code Page (win98, cp437, cp949)- DBCS(- DBCS( 아시아권아시아권 ))

AASCIISCII 의 문제의 문제

5 / 265 / 26

Page 7: UNICODE Seminar  – 한국에서 프로그래머 하기

Myth of UnicodeMyth of Unicode

6 / 266 / 26

유니코드 야사유니코드 야사

세계의 모든 문자를 표현할 수 있는 코드 체계를 만들자세계의 모든 문자를 표현할 수 있는 코드 체계를 만들자- - 영어 알파벳 몇백자영어 알파벳 몇백자 , , 한글 한글 11 만자만자 , , 한자 한자 22 만자만자 ....- - 모두 합쳐도 모두 합쳐도 66 만자도 안되겠네만자도 안되겠네 ....- BMP(Basic Multilingual Plane) - BMP(Basic Multilingual Plane) - Unicode 3.0 - Unicode 3.0 이하이하

세상일은 그리 만만하지 않다세상일은 그리 만만하지 않다 -_--_-- - 한글 고어한글 고어 , , 옛 한자옛 한자- SP(Supplementary Planes)- SP(Supplementary Planes) 를 정의를 정의

- 1024 * 1024 = 10- 1024 * 1024 = 10ex) ex) 한자는 추가적으로 약 한자는 추가적으로 약 44 만자만자

유니코드 콘소시엄 유니코드 콘소시엄 + + 세계 표준기구세계 표준기구 (ISO)(ISO)- 1991- 1991 년 이후 동일한 표준년 이후 동일한 표준- ISO / IEC 10646- ISO / IEC 10646

Page 8: UNICODE Seminar  – 한국에서 프로그래머 하기

Myth of UnicodeMyth of Unicode

7 / 267 / 26

유니코드 유니코드 3.13.1 에 정의된 언어 영역 에 정의된 언어 영역 (List of block names for Unicode Standard 3.1) (List of block names for Unicode Standard 3.1)

http://www.jinsuk.pe.kr/Unicode/Unicode_intro-kr.html#misleadhttp://www.jinsuk.pe.kr/Unicode/Unicode_intro-kr.html#mislead

유니코드의 구조는 유니코드의 구조는 1717 개의 언어판으로 구성개의 언어판으로 구성- 1- 1 개의 기본 언어판 개의 기본 언어판 + 16+ 16 개의 보충 언어판개의 보충 언어판- 17 * 65536 = 114112- 17 * 65536 = 114112 개 개 - 2048- 2048

Page 9: UNICODE Seminar  – 한국에서 프로그래머 하기

Myth of UnicodeMyth of Unicode

8 / 268 / 26

유니코드 용어유니코드 용어

- 기본언어판 , BMP

BMP 는 Basic Mulitilingual Plane 의 약자입니다 . 유니코드의 첫 65,536 개의 코드를 의미합니다 .

- 언어판 , Plane

256x256 즉 65,536 개씩의 코드 묶음을 이릅니다 . 유니코드에서는 현재 17 개의 언어판을 사용할 수 있습니다 . 모두 그룹 00 에 포함됩니다 .

- 언어판 그룹 , Group

256 개씩의 언어판을 묶어 하나의 그룹으로 명명합니다 . 유니코드의 17 개 언어판은 모두 Group 00 에 있습니다 . 유니코드는 17 개의 언어판에 한정되어 정의됩니다 . 반면 ISO 표준 (UCS-4) 에서는 모두 128 개의 언어판 그룹이 정의될 수 있습니다 .

- 1 Plane = 65,536 code points - 1 Group = 256 planes = 256x65,536 = 16,777,216 code points - UCS-4 = 128 groups = 128x16,777,216 = 2,147,483,648 code points

Page 10: UNICODE Seminar  – 한국에서 프로그래머 하기

Myth of UnicodeMyth of Unicode

9 / 269 / 26

유니코드 용어유니코드 용어

- 인코딩 , Encoding 문자집합을 표현하는 방식을 말합니다 . 유니코드는 코드체계 또는 문자집합을 명명하는 것이며 이를 표현하기 위해서는 UTF-8, UTF-16, UTF-32 등과 같은 인코딩이 필요합니다 .

UCS-2: Universal Character Set 2(octets) 좀더 정확하게는 Universal Multipe-Octet Coded Character Set 2 입니다 . ISO/IEC 10646 의 용어로 BMP 의 65,536 코드를 정의하며 , 2 바이트로 표현됩니다 . 1 개의 언어판 , 즉 BMP 만이 이에 해당합니다 . UCS-2 는 인코딩 방법이 아니며 문자코드 자체입니다 . 인코딩으로 봐도 무방하겠군요 . 여기서 octet 이라는 용어를 사용했는데 이 용어는 ISO 쪽에서 사용하는 용어로 , 유니코드 진영에서 사용하는 바이트와 같은 뜻입니다

UCS-4: Universal Character Set 4(octets) ISO/IEC 10646 의 용어로 4 바이트로 표현됩니다 . 모두 128 개의 언어판 그룹 , 즉 128*256 언어판 = 32,768 언어판을 정의합니다 . 이는 대략 231 = 2,147,483,648 개의 코드에 해당합니다 . UCS-4 는 인코딩 방법이 아니며 문자코드 자체입니다 .

Page 11: UNICODE Seminar  – 한국에서 프로그래머 하기

Myth of UnicodeMyth of Unicode

10 / 10 / 2626

유니코드 용어유니코드 용어

UTF-8: UCS Transformation Format, 8-bit form Unicode 표준의 인코딩 방식중의 하나입니다 . 표준에서는 17 개 언어판의 문자만을 표현할 수 있으나 기술적으로는 UCS-4 전영역의 문자를 표현할 수 있습니다 . 문자에 따라 1 ~ 4( 또는 6) 바이트로 표현됩니다 .

UTF-16: UCS Transformation Format, 16-bit form 유니코드 3.0 에서는 16 을 16 비트로 해석한 것이 아니라 , 그룹 00 의 16 개 언어판이라고 써 놓았군요 . UTF-32 의 32 가 32 비트를 지칭하므로 통일성을 위해 16 비트로 이해하시는 게 좋습니다 . 16 비트로 표현한다는 점에서는 UCS-2 와 흡사하지만 대행문자영역 (Surrogates) 을 이용하여 16 개의 보충 언어판 코드를 표현할 수 있는 인코딩입니다 . 대행문자영역 2 개로 16 개의 보충 언어판을 표현할 수 있습니다 . UCS-2 에서는 65536 개의 코드만을 정의할 수 있으나 UTF-16 에서는 1 백만여자를 더 표현할 수 있습니다 .

UTF-32: UCS Transformation Format, 32-bit form 32 비트 즉 4 바이트로 각 문자를 표현합니다 . 이점에서 UCS-4 와 동일하지만 17 개의 언어판만을 정의한다는 점에서는 UCS-4 의 부분집합으로 간주하면 됩니다 . UCS-4 와 동일하나 0x00000000 ~ 0x0010FFFF 범위만을 문자코드로 간주한다고 이해하시면 됩니다 .

Page 12: UNICODE Seminar  – 한국에서 프로그래머 하기

Myth of UnicodeMyth of Unicode

11 / 11 / 2626

유니코드 인코딩유니코드 인코딩

유니코드에서 지원하는 인코딩 방식은 UTF-8, UTF-16, UTF-32 의 세가지 방식입니다 . UTF 는 UCS Transformation Format 의 약자이며 , 뒤에 붙은 숫자는 인코딩에 사용되는 단위의 비트수를 의미합니다 . 즉 UTF8 은 8 비트 단위 , UTF16 은 16 비트 단위 , UTF32 는 32 비트 단위로 문자를 표현합니다 .

세가지 방식의 공통점이라면 16 개의 보충언어판에 위치한 1,048,576 개의 코드를 표현할 때는 4 바이트를 사용한다는 점입니다 .

하지만 그 방식은 모두 다릅니다 . UTF8 은 4 개의 바이트로 , UTF16 은 2 개의 16 비트로 , UTF32 는 1 개의 32 비트 단위로 표현합니다 .

이제 각 인코딩 방식에 대해 좀더 상세하게 설명하겠습니다 .

Page 13: UNICODE Seminar  – 한국에서 프로그래머 하기

Myth of UnicodeMyth of Unicode

12 / 12 / 2626

유니코드 인코딩 유니코드 인코딩 – – UTF16UTF16

UCS-2UCS-2 와 거의 동일합니다와 거의 동일합니다 . . 이 인코딩의 기본 단위는 이 인코딩의 기본 단위는 1616 비트비트 , , 즉 즉 22 바이트입니다바이트입니다 . . 대행문자 영역 대행문자 영역 2,0482,048 개를 제외한 개를 제외한 63,48863,488 개의 코드를 문자로 사용할 수 있으며개의 코드를 문자로 사용할 수 있으며 (BMP), (BMP), 대행문자 영역 대행문자 영역 22 개의 쌍을 이용하여 개의 쌍을 이용하여 1616 개의 보충언어판에 위치한 개의 보충언어판에 위치한 1,048,5761,048,576 개의 코드를 표현할 수 있습니다개의 코드를 표현할 수 있습니다 . .

대행 문자 대행 문자 22 개의 쌍으로 개의 쌍으로 11 개의 문자를 인코딩한다는 점에서 개의 문자를 인코딩한다는 점에서 UTF-16UTF-16 의 인코딩은 가변적인 인코딩이라고 할 수 있겠군요의 인코딩은 가변적인 인코딩이라고 할 수 있겠군요 . . 즉 기본언어판의 문자는 즉 기본언어판의 문자는 22 바이트로 보충언어판의 문자는 바이트로 보충언어판의 문자는 44 바이트로 인코딩됩니다바이트로 인코딩됩니다 . .

이러한 인코딩 방식때문에 이러한 인코딩 방식때문에 UTF-16UTF-16 에서는 에서는 유니코드 표준에서 지원하는 유니코드 표준에서 지원하는 1717 개의 언어판 코드만 표현이 가능합니다개의 언어판 코드만 표현이 가능합니다 . . 가장 유니코드다운 인코딩이라고 할 수 있겠군요 가장 유니코드다운 인코딩이라고 할 수 있겠군요 :-) :-)

UTF-16UTF-16 에서는 상위대행코드가 나타나면 반드시 뒤이어 하위대행코드가 따라와야 합니다에서는 상위대행코드가 나타나면 반드시 뒤이어 하위대행코드가 따라와야 합니다 . . UCS-2UCS-2 에서는 그렇지 아니한 점이 에서는 그렇지 아니한 점이 UTF-16UTF-16 과 과 UCS-2UCS-2 의 차이점입니다의 차이점입니다 . .

Page 14: UNICODE Seminar  – 한국에서 프로그래머 하기

Myth of UnicodeMyth of Unicode

13 / 13 / 2626

유니코드 인코딩 유니코드 인코딩 – – UTF8UTF8

UCS-4 UTF-8

0x00000000 - 0x0000007F 0xxxxxxx

0x00000080 - 0x000007FF 110xxxxx 10xxxxxx

0x00000800 - 0x0000FFFF 1110xxxx 10xxxxxx 10xxxxxx

0x00010000 - 0x001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

0x00200000 - 0x03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

0x04000000 - 0x7FFFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-16UTF-16 의 문제 의 문제 - null byte- null byte

-> -> 소프트웨어 재개발소프트웨어 재개발- - 저장 공간의 문제저장 공간의 문제

-> DB -> DB 설계 다시설계 다시- - 대안 대안 : UTF8 : UTF8

- - 중간 바이트에서 중간 바이트에서 00 이 나타나지 않도록이 나타나지 않도록 ))- 1byte- 1byte 에서 에서 4byte4byte 의 가변 바이트의 가변 바이트

Page 15: UNICODE Seminar  – 한국에서 프로그래머 하기

Myth of UnicodeMyth of Unicode

14 / 14 / 2626

유니코드 인코딩 유니코드 인코딩 – – UTF32UTF32

UTF-32UTF-32 는 는 3232 비트비트 , , 즉 즉 44 바이트로 모든 유니코드 문자를 표현합니다바이트로 모든 유니코드 문자를 표현합니다 . . UTF-8UTF-8 과 과 UTF-16UTF-16 에 대비해서 고정길이 인코딩이라고 할 수 있겠군요에 대비해서 고정길이 인코딩이라고 할 수 있겠군요 . . 44 바이트 단위로 표현한다해서 바이트 단위로 표현한다해서 UCS-4UCS-4 와 동일하게 볼 수는 없습니다와 동일하게 볼 수는 없습니다 . .

1717 개의 언어판만을 대상으로 하는 개의 언어판만을 대상으로 하는 UCS-4UCS-4 의 부분집합이라고 보시면 됩니다의 부분집합이라고 보시면 됩니다 (( 표준상 그렇습니다표준상 그렇습니다 ). ). 즉 즉 UTF-32UTF-32 의 인코딩 영역은 의 인코딩 영역은 0x000000000x00000000 에서 에서 0x0010FFFF0x0010FFFF 로 제한되어야 합니다로 제한되어야 합니다(( 이 제한을 무시하면 이 제한을 무시하면 UCS-4UCS-4 와 동일합니다와 동일합니다 ).).

Byte Order Mark Byte Order Mark (ex 0x4E00 b:-, l:N)(ex 0x4E00 b:-, l:N)

구분 Little-endian Big-endian

UTF-16 0xFFFE 0xFEFF

UTF-32 0x0000FFFE 0x0000FEFF

플랫폼 Intel, DEC/Alpha 프로세서 RISC 프로세서 , Microprocessor

운영체제 MS Window, 리눅스 /인텔 Unix, Mac OS

Page 16: UNICODE Seminar  – 한국에서 프로그래머 하기

CAMEL CAMEL PROGRAMMERPROGRAMMER

15 / 15 / 2626

한글 한글 한글한글 한글 한글……

일반 텍스트일반 텍스트 ??- - 가가 가가가가 가가 ??

제 웹사이트가 깨져 보여요제 웹사이트가 깨져 보여요- Content-type: text/plain; charset=“utf-8”- Content-type: text/plain; charset=“utf-8”- Explorer - Explorer 언어 추측언어 추측- - 언어의 언어의 UCS-2UCS-2

java, c++, c#java, c++, c#phpphp

조합형 한글 조합형 한글 vs vs 완성형 한글완성형 한글- 1 + 2^5 + 2^5 + 2^5- 1 + 2^5 + 2^5 + 2^5- - 아래한글과 아래한글과 MSMS 워드의 싸움워드의 싸움

Page 17: UNICODE Seminar  – 한국에서 프로그래머 하기

오라클 오라클 NLSNLS

16 / 16 / 2626

SetupSetup

위 창은 한국어 저장 여부하고는 아무 위 창은 한국어 저장 여부하고는 아무 Never Never 절대 상관이 없다절대 상관이 없다 ..- - 번역된 메시지번역된 메시지- - 폰트폰트- - 로케일정보로케일정보

Page 18: UNICODE Seminar  – 한국에서 프로그래머 하기

오라클 오라클 NLSNLS

17 / 17 / 2626

올바른 캐릭터 셋을 선택하자올바른 캐릭터 셋을 선택하자

올바른 캐릭터셋이라 함은 한글을 저장할 수 있는 캐릭터 셋을 말한다올바른 캐릭터셋이라 함은 한글을 저장할 수 있는 캐릭터 셋을 말한다 ..

정해진 캐릭터 셋을 가지고 있지 않은 데이터베이스에 결코 한글 데이터를 저장할 수 없다정해진 캐릭터 셋을 가지고 있지 않은 데이터베이스에 결코 한글 데이터를 저장할 수 없다 ..

이제 이제 US7ASCIIUS7ASCII 와는 헤어질때다와는 헤어질때다 ..- KO16KSC5601- KO16KSC5601- KO16MSWIN949- KO16MSWIN949- UTF8- UTF8- AL32UTF8- AL32UTF8

Page 19: UNICODE Seminar  – 한국에서 프로그래머 하기

오라클 오라클 NLSNLS

18 / 18 / 2626

KO16KSC5601KO16KSC5601

한글 완성형 코드와 일치한글 완성형 코드와 일치 ( 2350( 2350 한글한글 (25*94), 4888(25*94), 4888 자의 한자자의 한자 , , 히라카나히라카나 , , 카타카나카타카나 , , 영문영문 , , 기호 등기호 등 ))UNIX (Lang=ko) defaultUNIX (Lang=ko) default

하지만하지만 ~~~ KO16KSC5601 ~~~ KO16KSC5601 캐릭터 셋 사용은 자제하라캐릭터 셋 사용은 자제하라……

아아햏햏햏햏모두에게 모두에게 먄먄하게 되었소하게 되었소 . . 솔솔믜믜가 예약했던 커피가 예약했던 커피숖숖이 배신을 때리는 바람에 이 배신을 때리는 바람에 그만 낙동강 오리알이 되었지요그만 낙동강 오리알이 되었지요 . . 정말 정말 먄먄하오하오 ..

똠똠방각하방각하

아아 ? ?? ?모두에게 모두에게 ??하게 되었소하게 되었소 . . 솔솔 ??가 예약했던 커피가 예약했던 커피 ??이 배신을 때리는 바람에 이 배신을 때리는 바람에 그만 낙동강 오리알이 되었지요그만 낙동강 오리알이 되었지요 . . 정말 정말 ??하오하오 ..

??방각하방각하

Page 20: UNICODE Seminar  – 한국에서 프로그래머 하기

오라클 오라클 NLSNLS

19 / 19 / 2626

KO16MSWIN949KO16MSWIN949

Windows-949 Windows-949 캐릭터셋은 마이크로소프트사의 캐릭터셋은 마이크로소프트사의 Windows Codepage 949Windows Codepage 949 번번 , , 즉 한글 코드 페이지를 따른 코드셋이다 즉 한글 코드 페이지를 따른 코드셋이다

다른 운영 체제에서도 사용할 수 있다다른 운영 체제에서도 사용할 수 있다 !"!"

완성형완성형 (KO16KSC5601)(KO16KSC5601) 을 그대로 포함하고 있으며을 그대로 포함하고 있으며 , , 추가로 현대 한글 조합으로 표현할 수 있는 모든 가짓수에 해당하는추가로 현대 한글 조합으로 표현할 수 있는 모든 가짓수에 해당하는 88228822 자의 한글을 추가해 포함하고 있다자의 한글을 추가해 포함하고 있다 . . 그러니까 그러니까 "Windows-949 "Windows-949 캐릭터셋은 캐릭터셋은 KSC5601KSC5601 의 수퍼셋의 수퍼셋 (Superset)"(Superset)" 이 되며이 되며 , , 따라서 따라서 "KO16MSWIN949 "KO16MSWIN949 또한 또한 KO16KSC5601KO16KSC5601 의 수퍼셋의 수퍼셋 " " 이다이다

Page 21: UNICODE Seminar  – 한국에서 프로그래머 하기

오라클 오라클 NLSNLS

20 / 20 / 2626

UTF8/AL32UTF8UTF8/AL32UTF8

UTF8UTF8 은 유니코드를 구현한 캐릭터셋 중에 가변길이 인코딩 방식을 택하고 있는 캐릭터셋이다은 유니코드를 구현한 캐릭터셋 중에 가변길이 인코딩 방식을 택하고 있는 캐릭터셋이다 . . 자세한 인코딩 방식은 여기에서 논할 필요가 없지만자세한 인코딩 방식은 여기에서 논할 필요가 없지만 , , 가변 길이를 위해 일종의 플래그 비트를 각 바이트마다 포함시켜야 하다보니가변 길이를 위해 일종의 플래그 비트를 각 바이트마다 포함시켜야 하다보니 , , 한 글자를 표한하는데 필요한 바이트의 길이가 한 글자를 표한하는데 필요한 바이트의 길이가 최대 최대 33 바이트바이트 (AL32UTF8(AL32UTF8 의 경우 의 경우 66 바이트바이트 )) 까지 늘어날 수 있다까지 늘어날 수 있다 . .

유니코드는 잘 알려진 바와 같이 유니코드는 잘 알려진 바와 같이 현대 한글 현대 한글 1117211172 자를 모두 가나다 순으로 잘 정렬된 상태로 포함하고 있다자를 모두 가나다 순으로 잘 정렬된 상태로 포함하고 있다 . . 그래도 한글 한 자가 그래도 한글 한 자가 33 바이트의 물리적 공간을 차지하므로바이트의 물리적 공간을 차지하므로 , , 오로지 모든 한글을 지원한다는 이유만으로 사용하는 것은 곤란하다오로지 모든 한글을 지원한다는 이유만으로 사용하는 것은 곤란하다 . .

하지만하지만 , , 한글 이외에도 다른 언어들을 함께 데이타베이스에 저장해야 한다면 한글 이외에도 다른 언어들을 함께 데이타베이스에 저장해야 한다면

다른 선택의 여지가 없는 유일한 선택이 된다다른 선택의 여지가 없는 유일한 선택이 된다 ..

Page 22: UNICODE Seminar  – 한국에서 프로그래머 하기

오라클 오라클 NLSNLS

21 / 21 / 2626

한글 캐릭터 셋 비교한글 캐릭터 셋 비교

KO16KSC5601 KO16MSWIN949

UTF8 AL32UTF8

한글 지원 한글 2350 2350+ 확장 8822( 총 11172 자 )

한글 11172 자 한글 11172 자

인코딩 버전 한글 완성형 확장은 MS949 에 따라 배열

Unicode2.1, 3.0 Unicode 3.0, 3.1, 3.2, 4.0

한글 바이트 2 byte 2byte 3byte 3byte

지원버전 7.x 8.0.6 이상 8.0 이후 9i R1 이상

Nchar 로 설정가능 불가 불가 가능 불가

한글정렬 단순 바이너리정렬 KOREAN_M, UNICODE_BINARY

한글 : 바이너리한자 : KOREAN_M

장점 없음 2byte 로 모든 한글 입출력 가능

정렬이 효과적 , 다른언어들과 같이 저장되어야 할 경우 다른 대안이 없음

동일

단점 한글 2350가능한 사용자제

완성형과 호환 문제로 글자배열순과 정렬순서가 다름

공간의 소모인코딩 /디코딩 시간

Page 23: UNICODE Seminar  – 한국에서 프로그래머 하기

오라클 오라클 NLSNLS

22 / 22 / 2626

자자 . . 이걸 기억하자이걸 기억하자

- - 한글 지원을 위해서는 반드시 위의 네 가지 캐릭터셋 중에 하나를 선택해야 한다 한글 지원을 위해서는 반드시 위의 네 가지 캐릭터셋 중에 하나를 선택해야 한다

- - 한국에서만 사용하는 시스템이라면 한국에서만 사용하는 시스템이라면 KO16MSWIN949KO16MSWIN949 를 선택한다 를 선택한다

- - 한국어 뿐 아니라 중국어한국어 뿐 아니라 중국어 , , 일본어일본어 , , 러시아어 등 다양한 언어로 된 데이타를 저장해야 한다면 러시아어 등 다양한 언어로 된 데이타를 저장해야 한다면 UTF8, AL32UTF8UTF8, AL32UTF8 을 선택한다을 선택한다 . .

- - 대부분이 한글이며대부분이 한글이며 , , ““ 일부일부” ” 컬럼에 외국어가 필요하다면컬럼에 외국어가 필요하다면 , , 한국어 기반의 캐릭터셋한국어 기반의 캐릭터셋 (KO16MSWIN949)(KO16MSWIN949) 을 사용하되을 사용하되 , , National CharactersetNational Characterset 을 이용한 컬럼에 외국어를 저장한다을 이용한 컬럼에 외국어를 저장한다 ..

ex) CREATE TABLE test_tableex) CREATE TABLE test_table( varchar_value VARCHAR2(2000),( varchar_value VARCHAR2(2000),nvarchar_value NVARCHAR2(2000)nvarchar_value NVARCHAR2(2000)););

NLS_LANG NLS_LANG 변수는 데이타베이스에게 사용자의 환경을 알려주는 인식표 역할을 한다변수는 데이타베이스에게 사용자의 환경을 알려주는 인식표 역할을 한다 ..- KOREAN_KOREA.KO16MSWIN949 (in window)- KOREAN_KOREA.KO16MSWIN949 (in window)- AMERICAN_AMERICA.KO16MSWIN949- AMERICAN_AMERICA.KO16MSWIN949- KOREAN_KOREA.KO16KO16KSC5601 (in unix)- KOREAN_KOREA.KO16KO16KSC5601 (in unix)

Page 24: UNICODE Seminar  – 한국에서 프로그래머 하기

오라클 오라클 NLSNLS

23 / 23 / 2626

KSC5601KSC5601 에서 지원되지 않는 글자들의 입출력에서 지원되지 않는 글자들의 입출력

-KO16KSC5601 CSKO16KSC5601 CS 에 얼마든지 그런 글자들을 삽입할 수 있던데요에 얼마든지 그런 글자들을 삽입할 수 있던데요 ??- insert into test(a) values(‘insert into test(a) values(‘ 숖’숖’ ) ;) ;- select * from test select * from test

??- NLS_LANGNLS_LANG 를 를 KO16KSC5601KO16KSC5601 로 하면 로 하면 ??

Insert Insert 실패실패숖숖 , , 똠똠 , , 믜믜 , , 뾃뾃 , , 햏햏

-KSC5601 CSKSC5601 CS 의 정렬의 정렬- 한글한글 , , 그리고 한문도 한자의 음에 맞게 정렬그리고 한문도 한자의 음에 맞게 정렬- 그러나 한글 그러나 한글 23502350 자와 한자 자와 한자 48884888 자에 대한 정렬자에 대한 정렬- 지원하지 않는 글자에 대한 정렬은 되지 않음지원하지 않는 글자에 대한 정렬은 되지 않음

Page 25: UNICODE Seminar  – 한국에서 프로그래머 하기

오라클 오라클 NLSNLS

24 / 24 / 2626

MS949MS949 에서의 정렬에서의 정렬

기존 기존 KO16KSC5601KO16KSC5601 의 수퍼셋으로 군림하려다 보니 의 수퍼셋으로 군림하려다 보니 총 총 1117211172 자의 한글의 바이트 코드가 한글의 언어적 정렬 순서와 불일치할 수 밖에 없다 자의 한글의 바이트 코드가 한글의 언어적 정렬 순서와 불일치할 수 밖에 없다

Select * From test Order by aSelect * From test Order by a 똠방각하똠방각하 먄해먄해 가나다라마바사가나다라마바사 라디오를켜라라디오를켜라 햏햏햏햏

Select * From test Order by NLSSORT(a, ‘NLS_SORT=UNICODE_BINARY’)Select * From test Order by NLSSORT(a, ‘NLS_SORT=UNICODE_BINARY’) 가나다라마바사가나다라마바사 똠각하똠각하 라디오를켜라라디오를켜라 먄해먄해 햏햏햏햏

Select * From test Order by NLSSORT(a, ‘NLS_SORT=KOREAN_M’)Select * From test Order by NLSSORT(a, ‘NLS_SORT=KOREAN_M’)

Page 26: UNICODE Seminar  – 한국에서 프로그래머 하기

오라클 오라클 NLSNLS

25 / 25 / 2626

바로잡기의 필요성을 인식하라바로잡기의 필요성을 인식하라

Ex)Ex)String p_UserComment = String p_UserComment =

new String(request.getParameter(“val").getBytes("KSC5601"),"8859_1");new String(request.getParameter(“val").getBytes("KSC5601"),"8859_1");pstmt.setString(1,p_UserComment);pstmt.setString(1,p_UserComment);pstmt.executeUpdate();pstmt.executeUpdate();

if(resultSet.next())if(resultSet.next()){{    String v_UserComment =     String v_UserComment =

new String(resultSet.getString(“val").getBytes("8859_1"),"KSC5601");new String(resultSet.getString(“val").getBytes("8859_1"),"KSC5601");

확장 불가확장 불가 , , 마이그레이션 불가마이그레이션 불가

Page 27: UNICODE Seminar  – 한국에서 프로그래머 하기

오라클 오라클 NLSNLS

26 / 26 / 2626

캐릭터 셋 변경의 위험성캐릭터 셋 변경의 위험성

데이터 절삭데이터 절삭

데이터 깨짐데이터 깨짐- US7ASCII- US7ASCII 에서 한글데이타를 에서 한글데이타를 exp/impexp/imp 를 이용하여 를 이용하여 MS949MS949 나 나 UTF8UTF8 로 마이그레이션로 마이그레이션

- - 불가능불가능- KO16KSC5601- KO16KSC5601 에서 한글 데이터를에서 한글 데이터를…… ....

- - 일부 데이터 깨짐일부 데이터 깨짐

어플리케이션 오동작어플리케이션 오동작- - 글자 길이 연산의 오동작글자 길이 연산의 오동작

length, instr, substrlength, instr, substr

기존 캐릭터 셋 새로운 캐릭터 셋 변경가능여부

US7ASCII KSC5601/MS949/UTF8/AL32UTF8 가능

KO16KSC5601 KO16MSWIN949 가능

KO16MSWIN949 UTF8 불가능

UTF8 AL32UTF8 가능

Page 28: UNICODE Seminar  – 한국에서 프로그래머 하기

참조참조 참조참조

Joel Joel 의 블로그 의 블로그 http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200503170001http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200503170001

www.unicode.orgwww.unicode.orghttp://ww.unicode.orghttp://ww.unicode.org

오라클 오라클 NLSNLShttp://www.oracle.com/technology/global/kr/pub/columns/oracle_lns_1.htmlhttp://www.oracle.com/technology/global/kr/pub/columns/oracle_lns_1.html http://www.oracle.com/technology/global/kr/pub/columns/oracle_lns_2.html

진숙의 진숙의 Unicode Unicode 이야기이야기http://www.jinsuk.pe.kr/Unicode/Unicode_intro-kr.html

Windows toolWindows toolcharmapcharmap