Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

실용모듈개발

간단하지만 실용적인 기능을 구현한 모듈 저작물을 공유하는 공간입니다.

문자 <-> Unicode 변환기

작성자 : 박종명
최초 작성일 : 2008-07-08 (화요일)
최종 수정일 : 2008-07-08 (화요일)
조회 수 : 5298

이전 모듈에서는 문자를 아스키(ASCII) 코드로 변환하는 모듈을 작성해 보았습니다.

이번에는 문자를 유니코드(Unicode) 로 변환하는 모듈을 작성해 보겠습니다.

닷넷은 기본적으로 모든 문자를 유니코드로 처리합니다.
자세히 말해 UTF-16(유니코드 변환 형식, 16비트 인코딩 양식)을 사용하여 문자를 표시합니다
(내부적으로 UTF-8을 사용하는 경우도 있다고 합니다)
유니코드 인코딩 방식에는 UTF-8,UTF-16,UTF-32 등이 존재합니다.

닷넷 프레임워크에서는 UTF-16 인코딩 방식을 사용하며, 이러한 인코딩 관련 클래스를 제공하는데요,
UTF-16 에 해당하는 클래스로 System.Text.UnicodeEncoding 클래스가 있습니다.
이번에 제작할 샘플은 이 클래스를 이용하여 문자를 유니코드로 변환해 보겠습니다.

* 문자 -> 유니코드 변환

아래 코드는 문자를 입력받아서 해당 문자에 해당하는 유니코드 바이트 배열을 반환하는 메서드입니다. 

static byte[] ConvertToUnicode(char inputChar)

{

    Encoding encoder = new System.Text.UnicodeEncoding(true, true);

 

    byte[] bytes = encoder.GetBytes(new char[] { inputChar });

    return bytes;

}

이렇게 만들어진 샘플을 다음과 같이 테스트 해보면, 

static void Main(string[] args)

{

      char inputChar = '';

 

      byte[] bytes = ConvertToUnicode(inputChar);

 

      foreach (byte b in bytes)

      {

          Console.Write(b);   //바이트 내용 출력

          Console.Write(" "); //한 칸 띄우기

      }

}

 

아래와 같은 결과가 나옵니다.

 

 

결과는 원소가 2개인 바이트 배열이 반환되고 각 바이트는 '172' , '0' 라는 결과가 나왔습니다.
즉 한 문자를 위해 2바이트를 이용하고 있음을 알 수 있습니다.(닷넷은 모든 문자를 2바이트 유니코드를 사용합니다)
172를 2진수로 변환하면 1010 1100 입니다.
0   을 2진수로 변환하면  0000 0000 입니다.

 

따라서 172,2 를 연속된 2바이트로 표현하면, 1010110000000000   입니다.

 

1010110000000000 를 십진수로 표현하면 44032 가 나옵니다.

즉 유니코드 표에서 44032는 한글 문자 '가'에 해당합니다.

 

만일   ConvertToUnicode 메서드가 바이트배열(byte[])을 반환하는 것이 맘에 들지 않는다면
다음과 같이 16진수로 반환할 수 도 있습니다.
아래 코드는 기존의 ConvertToUnicode 메서드에서 바이트 배열을 바로 반환하지 않고 16진수 문자열로 만들어서 반환하고 있습니다.

 

static string ConvertToUnicode(char inputChar)

{

    Encoding encoder = new System.Text.UnicodeEncoding(true, true);

 

    byte[] bytes = encoder.GetBytes(new char[] { inputChar });

 

    //바이트 배열의 내용을 16진수 문자열로 만듦

    StringBuilder sb = new StringBuilder();           

    for (int i = 0; i < bytes.Length; i++)

    {

        sb.AppendFormat("{0:X2}", bytes[i]);

    }

 

    return sb.ToString();                     

}

 

 

 이렇게 변환된 메서드를 호출하면 다음과 같은 결과가 나옵니다.

 

즉 이전의 172(십진수)를 16진수로 변환하면 AC 가 됩니다. 그리고 0은 16진수에서도 여전히 0일 테구요.
따라서 결과는 AC 00 이 됩니다.

AC00 을 다음과 같이10진수로 변환하면  44032가 됩니다. 즉 '가'의 유니코드에 해당합니다.
10*163  + 12*162 = 44031


참고로, 위의 인코딩 객체를 생성할 때 다음과 같이 생성하였습니다.
Encoding encoder = new System.Text.UnicodeEncoding(true, true);
즉 Big-endian(최상위 바이트 먼저 사용) 하도록 하였습니다.
만일 UnicodeEncoding 를 매개변수 없는 생성자를 이용한다면 little-endian(최하위 바이트 먼저 사용)이 되어
바이트 순서가 바뀌어서 결과가 나타날 것입니다.
닷넷은 기본적으로 인텔 CPU 에서의 처리속도 향상을 위해 Little-endian 을 사용하지만 이 글에서는
우리(사람)들의 가독성을 위해 Big-endian 을 사용하였습니다.

* 유니코드 -> 문자 변환

이번에는 유니코드를 문자로 변환하는 모듈을 작성해 보겠습니다.
역시 '문자 -> 유니코드 변환'  에서와 같이 UnicodeEncoding 클래스를 이용합니다.
다음의 코드를 보겠습니다.

static char[] ConvertToChar(byte[] bytes)

{

    Encoding encoder = new System.Text.UnicodeEncoding(true,true);

 

    char[] chars = encoder.GetChars(bytes);

 

    return chars;

}

메서드는 유니코드에 해당하는 바이트 배열을 매개변수로 전달 받아서 문자 배열(Char[])로 반환하고 있습니다.
앞에서 '가' 에 해당하는 2바이트 값이 172,0 이었습니다.
아래 코드는 ConvertToChar  메서드를 이용하여 '172,0' 을 전달하여 '가'를 반환받는 클라이언트 코드입니다.

static void Main(string[] args)

{

    byte[] bytes = new byte[]{172,0};

 

    char[] chars = ConvertToUnicode(bytes);

 

    foreach (char c in chars)

    {

       Console.WriteLine(c);

    }

}

결과는 다음과 같습니다


2바이트로 172,0 을 전달하여 문자 '가'를 반환 받았습니다.


 

이름
비밀번호
홈페이지
KM <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요