C#

UTF8 <-> EUC-KR (URI Encoding)

C#을 시작한지 2주일. 사실 C# + .NET을 접한것.

한 줄 소감은..... 윈도우 개발은 .NET으로 끝.

이제 서서히 .NET도 완성단계에 이르렀고 C#의 강력한 객체지향능력은 .NET의 객체들을 더 활용할 수 있게 한다.


들어가기에 앞서 한글 문자열 인코딩에 관해 짤막하게 소개하려 한다.

 

인코딩이란 문자 코드표라고 생각하면 된다.


ASCII 인코딩을 보면

65=A

97=a

이다.


대부분의 인코딩에서도 Alphabet에 대해서는 ASCII와 동일하다.

그래서 영어는 인코딩 오류가 잘 안나는 것이다.


ASCII는 영어만 된다. 한국어를 위한 인코딩은 대표적으로 세가지 꼽을 수 있겠다.

1. euc-kr

2. codepage-949

3. unicode


1. euc-kr

이것은 ASCII에다가 완성형 조합으로 추가시킨거다. 가 각 간 갇 ...

가의 euc-kr 인코딩 값은 0xB0A1(45217)이다. 기억해두는게 좋다. (사실 외워진다. 새로운 환경(언어,library등)에서 인코딩하려다보면...인코딩 됬는지 확인을 해야하니)

2. codepage-949

내가 알기론. euc-kr에서 확장시킨거라고한다. microsoft에서 한글판 윈도우를 위해서 내장시킨 거다. euc-kr은 웹에서 많이보이는데 사실 949와 동일하다고 생각해도 된다. 실제로 .NET에서는 euc-kr의 codepage값을 949로 해놓더라.

3. unicode

유니코드는 세계모든문자표시를위한 인코딩이다. 한글은 '가' 인코딩값으로는 0xAC00(44032) 부터 시작하며 가각갂갃... 이렇게 된다. 


에엥 그런데 왜 인코딩엔 unicode가 없냐고? 

왜냐하면 인코딩의 목적은 전달인데 전달될때는 최대한 압축하고 통일시키는게 좋기때문이지.

그래서 UTF (unicode Transformation Format)이라고 변환을위한 포맷이 생겼지.

utf8 utf16같이 utf뒤에 오는 숫자는 format의 크기단위라고 해야할까? block단위? 라고해.


unicode는 a를 나타낼땐 ANSI와 같이 65를 쓰지.

엥? 65면 1byte로도 떡!치고도 남겠는데?

그래 그래서 그렇게 가변적으로는 utf8이 쓰이지 (한 블럭을 8bit, 즉 1Byte단위다.)

더나아가 16이라면 2Byte를 사용하니 2 혹은 4 혹은 6 ... 이겠지. 블럭최소단위가 16bit라는 얘기야




형식은 저렇게 생겼어. 슬데없어보이는 이상한 110 10 이런게있찌? 그냥 뭐 패리티비트정도로 생각하고 넘어가지 ㅋ

저걸직접짜보기도했는데 재밌긴하지만 생각해야할게 너무많더라~


자 이제 끝났어.

결론은

UTF8(UNICODE) != EUC-KR == CODEPAGE-949라는것.


그리고 하나 더 알아둬야 할 것은 

.NET의 string은 UTF8이다. char는 2byte로 ..... utf16인거같다 (확실치않음 char를 잘안씀)

string에 담는 순간 자동으로 utf8로 읽는다.


.NET에서 인코딩할때는 두가지 기억하면된다.

실제로 들어있는 값

그걸 읽을때 어떻게 인식하는지


string에 euc-kr로 인코딩된 byte를 넣으면?

mbox해보면 깨져나올꺼야.


왜냐하면 그 string에는 들어있는값은 euc-kr인데 .NET은 string을 항상 utf-8로 읽으려고하거든.


자. 한가지 이득은 뭐냐면 euc-kr을 utf-8로 가져오는건 참 쉽다.

str = Encoding.UTF8.GetString(Encoding.GetEncoding(949).GetBytes(str));


getbytes는 실제 들어있는 값을 해당 인코딩으로 변환해서 가져온다.

GetString은 해당 bytes를 해당 인코딩으로 해석해서 반환한다. 결국 반환된 형태는 항상 utf8일뿐 . . . . .


자 그럼 utf-8을 euc-kr로 변환?

사실 저걸 반대로하면 변환되긴한다.

기본 string은 utf8일테니까

utf8로 해석해서 bytes에 담은다음에 그걸 codepage949로 변환할테니

다만 그걸 mbox는 항상 utf8로 출력하려고할테니 깨져서 나오게되겠다. 

실제로 들어잇는 값은 euckr인데 그걸 utf8로 인식해서 읽으려니 영딴소리가 나올 수밖에.


그러면 ecu-kr로 어떻게변환해?


어차피 변환해서 uri encoding시키거나 뭐 보내고그럴꺼아닌가


그러면 그냥 bytes형태에서 % 하고 헥스로 해줘버리지 뭐..


public static string encodingURI(Encoding encoding, string src)

        {

            byte[] bb;

            string tmp = "";


            bb = encoding.GetBytes(src);

            foreach(byte b in bb)

            {

                tmp += "%" + string.Format("{0:X}", b);

            }


            return tmp;

        }


대신 단점은... 한글뿐만아니라 숫자같은것도 죄다 변환된다는거


뭐 그건 euckr코드표 참고해서 해당 byte값이나 등등이 뭐보다 클대만 변환하면되긴하겠지

귀찮으니 팻!~쓰


한마디로.

ALL -> UTF8은 쉬움 .NET의 문자열 개념이 utf8이라서

UTF8 -> EUCKR 은 코드내에서 디버깅때확인하기어려움

UTF8 -> URI Encoding (euc-kr) 은 가능한데 한글만 인코딩하기는 어려움(상관없음 사실. 받는쪽에서는 알아서 잘 디코딩할테니. 한글만 디코딩하는 멍청한 서버가 어딧겟어 ...?)


으악. 힘들다


,

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

카운터

Today :
Yesterday :
Total :

태그