티스토리 뷰

Source : http://edn.embarcadero.com/article/38454

 

유니코드는 무엇인가, 왜 필요한가, 델파이에서는 어떻게 사용하는가?

By: Beomyong Park

Abstract: 이 아티클은 유니코드 (Unicode)에 대해 논합니다, 델파이 개발자들이 유니코드를 사용함으로써 어떻게 장점을 취할 수 있는가 그리고 유니코드는 델파이 2009에서 어떻게 구현되는가에 대한 내용입니다

도입

인터넷은 지리적인 장벽을 허물고 소프트웨어의 범세계적인 보급을 가능하게 하였습니다. 그 결과 어플리케이션은 더 이상 순수 ANSI 기반 환경에만 머물 수 없게 되었습니다. 세상은 텍스트와 데이터 전달을 위한 표준 수단으로 유니코드를 받아들였습니다. 유니코드가 사실상 모든 기록 시스템에 지원을 제공한 이후, 유니코드는 이제 글로벌 기술 생태계 전반에 걸친 표준이 되었습니다.

유니코드(Unicode) 란?

유니코드 는 문자 인코딩 방법으로서 사실상 모든 문자가 단일 문자셋으로 인코딩될 수 있도록 합니다. 유니코드는 컴퓨터로 하여금 세상의 기록 시스템 대부분에서 텍스트를 관리하고 표시할 수 있도록 해줍니다. 유니코드는 유니코드 컨소시엄 이 관리하며 표준으로 성문화 되어 있습니다. 쉽게 말하자면, 유니코드는 모든 사람들이 서로의 문자를 사용할 수 있도록 하기 위한 시스템입니다. 이런, 심지어 클링온을 위한 유니코드 버전 까지 있습니다.

이 아티클 시리즈는 여러분에게 유니코드가 정확히 무엇이고 어떻게 작동하는 가에 대해 전체적으로 파고드는 내용을 전달하기 위함이 아니라 여러분이 델파이 2009 안에서 유니코드를 사용할 수 있도록 안내하고자 작성되었습니다. 만약 유니코드에 대한 좋은 오버뷰를 원하신다면, 조엘 스폴스키(Joel Spolsky)의 훌륭한 아티클인 “The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)”를 읽어 보실 것을 강력히 권장합니다. 조엘이 분명히 지적한 바와 같이 “이것은 그다지 어렵지 않습니다” 이 아티클은 전 3편 중 첫번째이며 유니코드가 왜 중요하고 델파이에서 새로운 유니코드스트링 타입을 어떻게 구현할 것인가에 대해 서술합니다.

왜 유니코드 인가?

델파이 2009의 많은 새로운 기능은 제품 전반에 걸친 유니코드에 있습니다. 델파이의 디펄트 스트링은 이제 유니코드 기반 스트링입니다. 델파이가 주로 델파이로 구축 되었기 때문에 델파이 IDE, 델파이 컴파일러, RTL, VCL는 이제 모두가 완전히 유니코드를 지원합니다.

델파이가 유니코드로 옮겨가는 것은 자연스러운 결과 입니다. 윈도우 자체가 완전히 유니코드를 인식하므로 유니코드를 디펄트 스트링으로 사용하는 것이 가장 자연스러운 것입니다. 그리고 델파이 개발자들에게 이 장점은 단순히 윈도우와 같은 스트링 타입을 사용할 수 있다는 것에서 멈추지 않습니다.

유니코드 지원은 델파이 개발자들에게 커다란 기회를 제공합니다. 델파이 개발자들은 이제 유니코드 데이터를 읽고 쓰고 받아들이고 생산하고 표시하고 다룰 수 있습니다. ? 그리고 이것은 모두 제품으로 구축됩니다. 아주 조금만, 일부의 경우 코드를 전혀 변경하지 않아도 여러분의 어플리케이션은 여러분과 여러분의 고객 또는 최종 사용자가 던질 수 있는 모든 종류의 데이터를 인식할 수 있게 됩니다.

예전에는 ANSI 로 인코딩된 데이터에만 제한 되었던 어플리케이션이 이제는 세상의 거의 모든 문자셋을 다룰 수 있도록 쉽게 변화될 수 있습니다.

델파이 개발자들은 이제 자신들의 어플리케이션을 글로벌 마켓에 제공할 수 있습니다 ? 비록 개발자들이 자신들의 어플리케이션을 지역화하거나 국제화 하기 위한 특별한 작업을 하지 않아도 그렇습니다. 윈도우 자체는 많은 서로 다른 지역화된 버전을 지원합니다, 그리고 델파이 어플리케이션은 일본어, 중국어 그리스어, 러이사어 버전의 윈도우와 같이 많은 로케일의 윈도우 상에서 작동하는 컴퓨터에서 적합하게 작동될 필요가 있습니다. 여러분의 소프트웨어를 사용하는 사용자는 여러분의 어플리케이션에 ANSI가 아닌 텍스트를 입력하거나 또는 ANSI가 아닌 경로명을 사용할 수 있습니다. ANSI 기반의 어플리케이션은 이러한 시나리오 상에서는 항상 의도된 대로 동작하지 않습니다. 완전히 유니코드를 지원하는 델파이에서 구축된 윈도우 어플리케이션은 이러한 상황을 잘 다루고 작동합니다. 비록 여러분이 여러분의 어플리케이션을 다른 나라 언어로 번역할 필요가 없더라도 여러분의 어플리케이션은 항상 올바르게 동작할 수 있어야 합니다. ? 최종 사용자의 로케일이 무엇이든지 상관없이 그래야 합니다.

현재의 ANSI 기반 델파이 어플리케이션은 이제 어플리케이션 지역화의 기회와 유니코드 기반 시장으로 가는 잠재력은 매우 큽니다. 그리고 만약 여러분이 여러분의 어플리케이션을 지역화 하기를 원하는 경우 델파이는 매우 쉽게 특히 디자인 타임에 매우 쉽습니다. ITE (Integrated Translation Environment)를 통해 여러분은 바로 IDE 안에서 번역하고 컴파일하고 배포할 수 있습니다. 만약 외부 번역 서비스가 필요하다면 IDE는 여러분의 프로젝트를 익스포트하여 번역자들이 사용할 수 있는 형태로 배포할 수 있는 ETM(External Translation Manger)과 관련하여 사용할 수 있습니다. 이 툴들은 델파이 IDE와 함께 작동하며 델파이와 C++빌더가 여러분의 어플리케이션을 지역화 하는 것을 부드럽고 쉽게 진행하게 합니다.

세상은 유니코드 기반입니다. 이제 델파이 개발자들은 본질적이고 유기적인 방식으로 이 세상의 일부가 될 수 있습니다. 따라서 여러분이 유니코드 데이터를 다루고 싶거나 여러분의 어플리케이션을 떠오르는 글로벌 시작에 판매하고자 한다면 델파이 2009를 가지고 할 수 있게 됩니다

용어에 대한 한마디

유니코드는 몇 개의 새로운 용어의 사용을 촉진합니다 예를 들어 “문자(character)”의 개념은 유니코드의 세상에서는 여러분이 사용하던 것보다 다소 부정확합니다. 유니코드에서 보다 정교한 용어는 “코드포인트(code point)”입니다. 델파이 2009에서 SizeOf(Char)는 2입니다. 하지만 이것이 전체 이야기를 말하지는 않습니다. 인코딩에 따라 주어진 문자가 2 바이트 이상을 차지할 수도 있습니다. 이러한 시퀀스를 “써로게이트 페어(Surrogate Pairs)”라고 합니다. 따라서 코드 포인트는 Unicode.org에서 정의한 고유한 코드 요소 입니다. 대부분 주로 “문자(character)이지만 항상 그렇지는 않습니다.

유니코드와 관련하여 여러분이 보게 될 또 다른 용어는 “BOM(Bype Order Mark)”입니다. 이것은 텍스트 파일의 인코딩에 사용된 타입을 가리키기 위해 텍스트 파일 앞부분에 위치한 매우 짧은 접두어 입니다. MSDN에 BOM 무엇인가에 대한 멋진 아티클 이 있습니다. 새로운 TEncoding 클래스 (2편에 거론 될 것입니다) 는 GetPreamble이라고 하는 클래스를 가지고 있어서 주어진 인코딩에 대한 BOM을 리턴합니다.

이제 모든 것이 설명되었으므로, 우리는 델파이 2009가 어떻게 유니코드 기반 스트링을 구현하는 지를 살펴볼 것입니다..

새로운 유니코드스트링 타입

델파이 2009의 디펄트 스트링은 새로운 UnicodeString 타입 입니다. 디펄트로, UnicodeString 타입은 윈도우에서 사용되는 것과 동일한 인코딩인 UTF-16과 밀접한 관계를 갖습니다. 이것이 디펄트 타입이 AnsiString 이었던 이전 버전과 달라진 점입니다. 과거 델파이 RTL은 유니코드 데이터를 다루기 위해 WideString 타입을 포함하고 있었습니다. 하지만 이 타입은 AnsiString 타입 일 때 고려되지 않습니다. 따라서 이제는 델파이 개발자들이 기대하는 디펄트 스트링으로 기대하는 만큼 완전하지 않습니다.

델파이 2009에서 새로운 UnicodString 타입이 새로 고안되었으며 AnsiString과 WideString 타입 모두를 관장합니다. UnicodeString은 유니코드 사이즈 문자 뿐만 아니라 ANSI 바이트 사이즈의 문자 모두를 담을 수 있습니다. (AnsiString과 WideString 모두 여전히 남아 있다는 것을 알아 두세요) Char과 PChar 타입은 각각 WideChar와 PWideChar에 대응될 것입니다. 또한 어떠한 string 타입도 사라지지 않는다는 점에 유의하세요. 개발자들이 지금껏 사용한 모든 타입이 여전히 존재하고 예전과 동일하게 동작합니다.

하지만, 델파이 2009에서 디펄트 스트링 타입은 UnicodeString과 동일 할 것입니다. 게다가 디펄트 Char 타입은 WideChar이고 디펄트 PChar 타입은 PWideChar 입니다.

즉, 다음의 코드가 컴파일러에 의해 선언됩니다:

type


  string = UnicodeString;


  Char = WideChar;


  PChar = PWideChar;


UnicodeString 은 모든 다른 스트링 타입들과 할당 호환됩니다; 하지만, AnsiString과 UnicodeString 사이의 할당은 적절한 타입 컨버전이 이루어 집니다. 따라서 UnicodeString 타입을 AnsiString 타입에 할당하는 것은 데이터 손실을 유발할 수 있습니다. 즉, 만약 UnicodeSting이 고순위 바이트 데이터를 포함하고 있다면 해당 스트링을 AnsiString으로 컨버전 하는 것은 고순위 바이트 데이터의 손실을 유발할 것입니다.



여기에서 유념해야 할 중요한 점은 새로운 UnicodeString은 스트링이 항상 가졌던 것과 거의 같이 동작한다는 것입니다. (물론 유니코드 데이터를 수용할 수 있다는 커다란 차이가 있습니다만). 여러분은 여전히 어떠한 스트링 데이터도 추가할 수 있습니다. 인덱스를 할 수 있고 ‘+’ 를 이용하여 스트링을 합칠 수도 있습니다.



예를 들어 UnicodeString의 인스턴스는 여전히 문자를 인덱스 할 수 있습니다. 다음의 코드를 보세요:



 var


   MyChar: Char;


   MyString: string;


 begin


   MyString := ‘This is a string’;


   MyChar := MyString[1];


 end;


변수 MyChar는 여전히 첫번째 인덱스에 있는 문자를 잡습니다. 즉 ‘T’입니다. 이러한 코드의 기능은 전혀 변경되지 않았습니다. 유사하게 우리가 만약 유니코드 데이터를 다룬다면:



 var


   MyChar: Char;


   MyString: string;


 begin


   MyString := ‘世界?好‘;


   MyChar := MyString[1];


 end;


변수 MyChar는 여전히 첫번째 인덱스에 있는 문자를 잡습니다. 즉 ‘世 입니다.



RTL은 핼퍼 함수를 제공하여 사용자들이 코드페이지 사이에서 명시적인 컨버전과 엘리먼트 사이즈 컨버전을 허용합니다. 만약 사용자가 문자 배열에서 Move 함수를 사용한다면, 엘리먼트 사이즈에 대해 가정을 할 수 없습니다.



여러분이 상상할 수 있듯이 이 새로운 스트링 타입은 기존 코드에 파생 효과가 있습니다. 유니코드에서 하나의 Char가 1 바이트라는 것은 더 이상 참(true)이 아닙니다. 사실, 하나의 Char 가 2 바이트와 같다는 것도 항상 참일 수는 없습니다! 그 결과 여러분은 여러분의 코드에 몇가지 보정을 해야할 수도 있습니다. 하지만, 우리는 이러한 전이가 부드럽게 되도록 많이 노력하였습니다, 그 결과 여러분이 완전하게 그리고 빠르게 구동할 수 있을 것이라고 확신합니다. 2편과 3편은 새 UnicodeString 타입에 대해 더 깊이 논할 것이며 유니코드를 지원하는 RTL의 새 기능에 대해 이야기 할 것입니다. 그리고 나서 여러분이 자신의 코드를 살펴 보기를 원할 특정 코딩 이디엄을 논할 것입니다. 이 시리즈는 여러분이 부드럽게 그리고 고통 없은 시도를 통해 유니코드로 전이하는 것을 도울 것입니다.



결론



유니코드를 디펄트 스트링으로 하는 것에 더불어, 델파이는 사실상 세상의 모든 문자와 코드 페이지를 수용하고, 처리하고 표시할 수 있습니다. 여러분이 델파이 2009로 구축한 어플리케이션은 유니코드 텍스트를 쉽게 받아들이고 표시하고 다룰 수 있을 것이며 거의 모든 윈도우 로케일에서 훨씬 잘 동작할 것입니다. 델파이 개발자들은 이제 자신의 어플리케이션을 쉽게 지역화하고 번역할 수 있게 되므로 예전에 진입하기 어려웠던 시장에 들어갈 수 있습니다. 이제는 유니코드의 세상입니다. 그리고 이제 여러분의 델파이 어플리케이션은 유니코드 세상에서 살 수 있게 됩니다.



2편에서는 여러분이 유니코드 스트링을 쉽게 작업할 수 있도록 델파이 런타임 라이브러리의 변화와 업데이트에 대해 논할 것입니다.