문자열 인코딩 ( ASCII, ANSI, UNICODE, UTF8, EUC-K )
내가 문자열 인코딩을 접한 계기는 작업 중 프로토콜을 붙여 서버에게 받아온 패킷 데이터의 저장된 BYTE [] 형태의 데이터(예를 들어 서버에 저장된 랭킹 데이터 라던가... )를 String으로 인코딩해 출력하기 위함이었다.
* 프로토콜 : 기기 사이에서 원활한 통신을 위해 만든 통신 규약
* 패킷 : 컴퓨터 네트워크가 전달하는 데이터의 형식화된 블록 ( 구조체 라던가 )
* 인코딩 : 정보의 형태나 형식을 변환하는 처리나 처리 방식
서버는 C++ 이였으니 마샬링( Marshalling )을 통해 패킷 구조체를 정의하고... 또 받는 패킷이 고정 패킷인지 가변 패킷인지 고민하고 CSV( 문자열에 ', '를 기준으로 단어를 분리함 ) 형태가 뭔지 또 고민하며 고통받은 건 다른 이야기...
본론으로 들어와 이렇게 받아낸 데이터를 어떠한 방식으로든 출력해 확인해야 하는데 필요한 것이
"System.Text.Encoding", 문자열 인코딩이다.
"ASCII"
"American Standard Code for Information Interchange", 미국 정보교환 표준 부호 = 아스키라고 읽는다.
어디서 많이 들어봤을 이것은 정보교환용 7비트 부호체계로 128개 부호로 구성되어 영문 키보드로 입력할 수 있는 모든 기호가 할당되어있고, 단순, 간단해 어느 시스템에도 적용이 가능하지만 2바이트 이상으로 코드를 표현할 수 없는 점이 국제표준을 "유니코드"에게 넘겨주게 되었다. 그리고 영어만 된다.
왜 8비트가 아니라 7비트냐? 하면 나머지 1비트는 에러 검출에 사용됐기 때문이라고....
"ANSI"
"American National Standards Institute", 미국 국가표준 협회 = 안시.... 다.
8비트로 구성되어 256개의 문자 표현이 가능한데, 대략 ASCII의 확장판으로 이해하면 된다. 7비트에서 1비트를 각 언어별 Code값을 받아 다른 문자열을 표한하려 한 거니까. ANSI = ASCII(7비트) + CodePage(1비트)
때문에 영어가 아닌 다른 언어를 사용해야 한다면 CodePage를 동일하게 사용해줘야 이상한 오류가 생기지 않는다.
"UNICODE"
유니코드, 숫자와 글자 ( 키 와 값 ) 이 1:1로 매핑된 형태의 "코드"다.
조금 다른 게 인코딩, 즉 변환이 아니라 전 세계 거의 모든 문자를 2바이트로 1:1 매핑하는 "방식, 개념" 그 자체로 이 것 안에 UTF-8, UTF-16등이 UNICODE의 인코딩 방식으로 유니코드 표의 숫자 키를 어떻게 표현하는가로 갈리고 UTF-8이 대체로 효율적이다.
* 한 줄 정리 / UTF-8 : 유니코드를 위한 가변 길이 문자 인코딩(멀티 바이트) 방식 중 하나로, ANSI의 단점을 보완
UTF-16 : 16bit 기반으로 저장하는 UTF-8의 변형
UTF-32 : 모든 문자를 4바이트로 인코딩. 변환 알고리즘이나 가변 길이 인코딩 방식에 대한 고민을 하고 싶지 않을 때 유용
"EUC-KR"
2바이트로 한글을 표현할 수 있게 만든 인코딩 방식으로, 한글이 자음과 모음으로 이루어져 있는 글자니까
마치 국어처럼 자음과 모음, 각각에 코드 번호를 부여해 조합해 문자를 나타낸다.
ANSI를 한국에서 확장한 것으로 외국에서는 지원 안될 확률이 높음.
***** 그 외 핵심 정보
int euckrCodepage = 51949; -> Euc-Kr을 사용하기 위한 코드페이지 번호
출처 : http://msdn.microsoft.com/ko-kr/library/system.text.encoding.aspx
System.Text.Encoding euckr = System.Text.Encoding.GetEncoding(euckrCodepage);
나는 이런식의 코드를 저장해 Byte[] 형태로 넘어온 데이터를 euckr.GetStrings(Byte배열, 시작위치, 배열 크기) 형태로 사용해 String을 리턴받아 출력했다.