컴퓨터의 메모리는 반도체로 이루어져 있으며, 반도체는 수많은 트랜지스터의 집합체이다. 트랜지스터는 전기가 흐르거나 흐르지 않는 두 상태를 가지며, 이를 각각 0과 1로 표현한다. 이는 매우 기본적인 개념이다.
현실에서는 사람들이 10진수를 사용하기 때문에, 컴퓨터는 이를 간단한 변환 공식을 통해 2진수로 변환하여 메모리에 저장한다.
예를 들어, int 35라는 값이 있다면, 이는 2진수로 변환되어 메모리에 저장된다.
한편, 문자는 Charset이라는 숫자-문자 변환표를 통해 처리된다. 예를 들어, 숫자 65는 문자 변환표를 통해 A로 해석된다. 따라서 char 'A'를 저장한다는 것은 결국 메모리에 숫자 65를 2진수로 변환하여 저장하는 것을 의미한다.
결론적으로, 숫자 65와 문자 A는 동일한 이진수로 메모리에 저장된다. 이를 구분하는 것은 운영체제나 프로그램의 역할이다.
문자가 숫자가 되기 위해서는 문자 집합(Charset)이라는 문자 변환표가 필요하다. 이를 위해 1960년대에 ASCII(American Standard Code for Information Interchange)가 개발되었다.
초기 컴퓨터는 주로 영문 알파벳과 기본적인 구분자인 스페이스(Space)나 엔터(Enter)와 같은 단순한 표현만 다룰 수 있으면 충분했다. 이러한 필요를 충족하기 위해 ASCII는 7비트를 사용하여 128가지 문자를 표현하도록 설계되었다.
기존 ASCII는 서유럽 언어에서 필요한 추가 문자를 표현하기에는 부족했다. 이에 따라 새로운 문자 규격이 만들어졌으며, 이는 ASCII 위에 추가되어 기존 ASCII와의 호환성을 유지하도록 설계되었다.
ASCII와 호환되도록 설계이러한 설계로 인해 기존 ASCII 기반 시스템에서도 문제가 발생하지 않으면서, 서유럽 언어의 다양한 문자를 처리할 수 있게 되었다.
대한민국에서도 컴퓨터에서 한글을 표현할 필요성이 생기면서, 한글을 포함한 문자 집합을 설계하게 되었다. 이에 따라 한글 표현을 위해 EUC-KR이라는 문자 집합이 만들어졌다.
현 한글 윈도우에서 사용되는 문자집합이다. 한글 윈도우가 이를 아직 유지하는 바람에 거의 표준으로 자리잡은 UTF-8과의 문제가 발생하기도 한다.
자주 사용되는 한글 2350개를 추가해 EUC_KR를 구성했지만 모든 한글을 포함하기 위해서는 11,172개의 모든 한글 경우의 수를 포함하는 문자셋을 만들어야했고 MS_949가 이에 해당한다.
16bit(2byte) 기반의 문자셋으로 65536가지를 표현할 수있다. 1990년도에는 UTF-16이 가장 많이 사용되었는데 UTF-16의 문제는 1byte만 사용했던 ASCII에 비해 영문 사용에 있어 더 많은 용량을 차지하게 되었다는 것이다.(영문도 2byte) 그리고 ASCII와 호환이 되지 않았다.
현재의 사실상의 표준이며 1~4byte로 유동적인 용량을 나타낸다. ASCII에 해당한다면 1byte로 비ASCII의 경우 2~4byte로 인코딩 한다. 현재 대부분의 웹사이트와 애플리케이션에서 기본 인코딩으로 사용하고 있다.
초기의 자바는 기본 인코딩을 UTF-16으로 유지했기에 영어사용시 항상 2byte를 가졌지만 UTF-8이 사실상의 표준으로 올라서고 UTF-16의 용량 단점을 극복하기 위해 언어 자체적으로 영어의 경우 1byte만 사용하도록 하는 등의 최적화를 성공했다.
맥OS와 Windows 간에 파일을 주고받을 때 한글이 깨지는 경우가 종종 발생한다. 이는 서로 다른 문자 인코딩 체계를 사용하기 때문에 발생하는 문제다.
인코딩과 디코딩의 불일치
맥OS와 Windows의 인코딩 차이
UTF-8을 사용하는 반면, MS_949(EUC-KR 기반)를 여전히 많이 사용한다.인코딩 방식이 서로 맞지 않으면, 파일 내용이 올바르게 해석되지 못하고 깨진 문자(문자열로 보이지 않는 특수 문자나 이상한 기호)가 나타나게 된다.
파일 인코딩 확인 및 통일
UTF-8 권장).텍스트 편집기 활용
운영체제 설정 변경
UTF-8로 설정하거나, 변환 도구 사용
iconv, Notepad++ 등의 도구를 활용하여 파일의 인코딩을 변환.