290 likes | 682 Views
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.
E N D
UNICODE Seminar –한국에서 프로그래머 하기 2005.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
Global Software? • 언어(Language)적 지원 캐릭터 셋 - KO16MSWIN949, KO16KSC5601 정렬방식 - Linguistic Sorting(KOREAN_M) 날짜 표기에 사용되는 기호 - month, day, day of week, year 에러메시지 및 번역 2 / 26
Example Example 인코딩, 디코딩 Content-type in HTML, ISO-8859-1?, ISO-8859-5 이메일(웹)이 ????? 보여요, 글자가 깨졌어요.. request.getParam(“val”).getBytes(“euc-kr”), (new FileWriter(“aaa.txt”)).writeln(“abc”) 조합형 한글와 완성형 한글? UTF8? Unicode? ALUTF32, UCS-2, UTF16, UTF32??? UTF7 ??? Code947, i18n, L10N ?c각하, 아?? NLS-Lang?? KO16MSWIN949, KO16KSC5601 3 / 26
Legend Of ASCII • 왜 1byte는 8bit 인가? 1byte -> 8bit -> 2^8 -> 256 2byte -> 16bit -> 2^16 -> 65536
Legend Of ASCII • OEM • ASCII의 문제 - OEM 문자 (127) - Code Page (win98, cp437, cp949) - DBCS(아시아권) 5 / 26
유니코드 야사 Myth of Unicode 세계의 모든 문자를 표현할 수 있는 코드 체계를 만들자 - 영어 알파벳 몇백자, 한글 1만자, 한자 2만자.. - 모두 합쳐도 6만자도 안되겠네.. - BMP(Basic Multilingual Plane) - Unicode 3.0 이하 세상일은 그리 만만하지 않다-_- - 한글 고어, 옛 한자 - SP(Supplementary Planes)를 정의 - 1024 * 1024 = 10 ex) 한자는 추가적으로 약 4만자 유니코드 콘소시엄 + 세계 표준기구(ISO) - 1991년 이후 동일한 표준 - ISO / IEC 10646 6 / 26
유니코드 3.1에 정의된 언어 영역 (List of block names for Unicode Standard 3.1) Myth of Unicode http://www.jinsuk.pe.kr/Unicode/Unicode_intro-kr.html#mislead 유니코드의 구조는 17개의 언어판으로 구성 - 1개의 기본 언어판 + 16개의 보충 언어판 - 17 * 65536 = 114112개 - 2048 7 / 26
유니코드 용어 Myth of Unicode • - 기본언어판, 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 8 / 26
유니코드 용어 Myth of Unicode • - 인코딩, 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는 인코딩 방법이 아니며 문자코드 자체입니다. 9 / 26
유니코드 용어 Myth of Unicode • 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 범위만을 문자코드로 간주한다고 이해하시면 됩니다. 10 / 26
유니코드 인코딩 Myth of Unicode 유니코드에서 지원하는 인코딩 방식은 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비트 단위로 표현합니다. 이제 각 인코딩 방식에 대해 좀더 상세하게 설명하겠습니다. 11 / 26
유니코드 인코딩 – UTF16 Myth of Unicode UCS-2와 거의 동일합니다. 이 인코딩의 기본 단위는 16비트, 즉 2바이트입니다. 대행문자 영역 2,048개를 제외한 63,488개의 코드를 문자로 사용할 수 있으며(BMP), 대행문자 영역 2개의 쌍을 이용하여 16개의 보충언어판에 위치한 1,048,576개의 코드를 표현할 수 있습니다. 대행 문자 2개의 쌍으로 1개의 문자를 인코딩한다는 점에서 UTF-16의 인코딩은 가변적인 인코딩이라고 할 수 있겠군요. 즉 기본언어판의 문자는 2바이트로 보충언어판의 문자는 4바이트로 인코딩됩니다. 이러한 인코딩 방식때문에 UTF-16에서는 유니코드 표준에서 지원하는 17개의 언어판 코드만 표현이 가능합니다. 가장 유니코드다운 인코딩이라고 할 수 있겠군요 :-) UTF-16에서는 상위대행코드가 나타나면 반드시 뒤이어 하위대행코드가 따라와야 합니다. UCS-2에서는 그렇지 아니한 점이 UTF-16과 UCS-2의 차이점입니다. 12 / 26
유니코드 인코딩 – UTF8 Myth of Unicode UTF-16의 문제 - null byte -> 소프트웨어 재개발 - 저장 공간의 문제 -> DB 설계 다시 - 대안 : UTF8 - 중간 바이트에서 0이 나타나지 않도록) - 1byte에서 4byte의 가변 바이트 13 / 26
유니코드 인코딩 – UTF32 Myth of Unicode UTF-32는 32비트, 즉 4바이트로 모든 유니코드 문자를 표현합니다. UTF-8과 UTF-16에 대비해서 고정길이 인코딩이라고 할 수 있겠군요. 4바이트 단위로 표현한다해서 UCS-4와 동일하게 볼 수는 없습니다. 17개의 언어판만을 대상으로 하는 UCS-4의 부분집합이라고 보시면 됩니다(표준상 그렇습니다). 즉 UTF-32의 인코딩 영역은 0x00000000에서 0x0010FFFF로 제한되어야 합니다 (이 제한을 무시하면 UCS-4와 동일합니다). • Byte Order Mark (ex 0x4E00 b:-, l:N) 14 / 26
한글 한글 한글… CAMEL PROGRAMMER 일반 텍스트? - 가가 가가? 제 웹사이트가 깨져 보여요 - Content-type: text/plain; charset=“utf-8” - Explorer 언어 추측 - 언어의 UCS-2 java, c++, c# php 조합형 한글 vs 완성형 한글 - 1 + 2^5 + 2^5 + 2^5 - 아래한글과 MS워드의 싸움 15 / 26
Setup 오라클 NLS 위 창은 한국어 저장 여부하고는 아무 Never 절대 상관이 없다. - 번역된 메시지 - 폰트 - 로케일정보 16 / 26
올바른 캐릭터 셋을 선택하자 오라클 NLS 올바른 캐릭터셋이라 함은 한글을 저장할 수 있는 캐릭터 셋을 말한다. 정해진 캐릭터 셋을 가지고 있지 않은 데이터베이스에 결코 한글 데이터를 저장할 수 없다. 이제 US7ASCII와는 헤어질때다. - KO16KSC5601 - KO16MSWIN949 - UTF8 - AL32UTF8 17 / 26
KO16KSC5601 오라클 NLS 한글 완성형 코드와 일치( 2350한글(25*94), 4888자의 한자, 히라카나, 카타카나, 영문, 기호 등) UNIX (Lang=ko) default 하지만~~~ KO16KSC5601 캐릭터 셋 사용은 자제하라… 아햏햏 모두에게 먄하게 되었소. 솔믜가 예약했던 커피숖이 배신을 때리는 바람에 그만 낙동강 오리알이 되었지요. 정말 먄하오. 똠방각하 아? ? 모두에게 ?하게 되었소. 솔?가 예약했던 커피?이 배신을 때리는 바람에 그만 낙동강 오리알이 되었지요. 정말 ?하오. ?방각하 18 / 26
KO16MSWIN949 오라클 NLS Windows-949 캐릭터셋은 마이크로소프트사의 Windows Codepage 949번, 즉 한글 코드 페이지를 따른 코드셋이다 완성형(KO16KSC5601)을 그대로 포함하고 있으며, 추가로 현대 한글 조합으로 표현할 수 있는 모든 가짓수에 해당하는 8822자의 한글을 추가해 포함하고 있다. 그러니까 "Windows-949 캐릭터셋은 KSC5601의 수퍼셋(Superset)"이 되며, 따라서 "KO16MSWIN949 또한 KO16KSC5601의 수퍼셋" 이다 다른 운영 체제에서도 사용할 수 있다!" 19 / 26
UTF8/AL32UTF8 오라클 NLS UTF8은 유니코드를 구현한 캐릭터셋 중에 가변길이 인코딩 방식을 택하고 있는 캐릭터셋이다. 자세한 인코딩 방식은 여기에서 논할 필요가 없지만, 가변 길이를 위해 일종의 플래그 비트를 각 바이트마다 포함시켜야 하다보니, 한 글자를 표한하는데 필요한 바이트의 길이가 최대 3바이트(AL32UTF8의 경우 6바이트)까지 늘어날 수 있다. 유니코드는 잘 알려진 바와 같이 현대 한글 11172자를 모두 가나다 순으로 잘 정렬된 상태로 포함하고 있다. 그래도 한글 한 자가 3바이트의 물리적 공간을 차지하므로, 오로지 모든 한글을 지원한다는 이유만으로 사용하는 것은 곤란하다. 하지만, 한글 이외에도 다른 언어들을 함께 데이타베이스에 저장해야 한다면 다른 선택의 여지가 없는 유일한 선택이 된다. 20 / 26
한글 캐릭터 셋 비교 오라클 NLS 21 / 26
자. 이걸 기억하자 오라클 NLS - 한글 지원을 위해서는 반드시 위의 네 가지 캐릭터셋 중에 하나를 선택해야 한다 - 한국에서만 사용하는 시스템이라면 KO16MSWIN949를 선택한다 - 한국어 뿐 아니라 중국어, 일본어, 러시아어 등 다양한 언어로 된 데이타를 저장해야 한다면 UTF8, AL32UTF8을 선택한다. - 대부분이 한글이며, “일부”컬럼에 외국어가 필요하다면, 한국어 기반의 캐릭터셋(KO16MSWIN949)을 사용하되, National Characterset을 이용한 컬럼에 외국어를 저장한다. ex) CREATE TABLE test_table ( varchar_value VARCHAR2(2000), nvarchar_value NVARCHAR2(2000) ); NLS_LANG 변수는 데이타베이스에게 사용자의 환경을 알려주는 인식표 역할을 한다. - KOREAN_KOREA.KO16MSWIN949 (in window) - AMERICAN_AMERICA.KO16MSWIN949 - KOREAN_KOREA.KO16KO16KSC5601 (in unix) 22 / 26
KSC5601에서 지원되지 않는 글자들의 입출력 오라클 NLS • KO16KSC5601 CS에 얼마든지 그런 글자들을 삽입할 수 있던데요? • insert into test(a) values(‘숖’) ; • select * from test • ? • NLS_LANG를 KO16KSC5601로 하면 ? • Insert 실패 • 숖, 똠, 믜, 뾃, 햏 • KSC5601 CS의 정렬 • 한글, 그리고 한문도 한자의 음에 맞게 정렬 • 그러나 한글 2350자와 한자 4888자에 대한 정렬 • 지원하지 않는 글자에 대한 정렬은 되지 않음 23 / 26
MS949에서의 정렬 오라클 NLS 기존 KO16KSC5601의 수퍼셋으로 군림하려다 보니 총 11172자의 한글의 바이트 코드가 한글의 언어적 정렬 순서와 불일치할 수 밖에 없다 Select * 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=KOREAN_M’) 24 / 26
바로잡기의 필요성을 인식하라 오라클 NLS Ex) String p_UserComment = new String(request.getParameter(“val").getBytes("KSC5601"),"8859_1");pstmt.setString(1,p_UserComment);pstmt.executeUpdate(); if(resultSet.next()){ String v_UserComment = new String(resultSet.getString(“val").getBytes("8859_1"),"KSC5601"); 확장 불가, 마이그레이션 불가 25 / 26
캐릭터 셋 변경의 위험성 오라클 NLS 데이터 절삭 데이터 깨짐 - US7ASCII에서 한글데이타를 exp/imp를 이용하여 MS949나 UTF8로 마이그레이션 - 불가능 - KO16KSC5601에서 한글 데이터를….. - 일부 데이터 깨짐 어플리케이션 오동작 - 글자 길이 연산의 오동작 length, instr, substr 26 / 26
참조 참조 Joel 의 블로그 http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200503170001 www.unicode.org http://ww.unicode.org 오라클 NLS http://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 이야기 http://www.jinsuk.pe.kr/Unicode/Unicode_intro-kr.html Windows tool charmap