출처 : https://www.youtube.com/watch?v=ABPOjjre0C8
이것도 좋음 : https://www.youtube.com/watch?v=1jo6q4dihoU
시작해보자
🧐 딱 두가지 개념만 알면 된다
1. 문자표라는 개념
2. 문자표를 인코딩한다는 개념
컴퓨터란게 처음 등장했을 때는 문자열을 표현하는 용도보다는 당연히 수학적인 계산을 하는 용도로 쓰였다
근데 수학적인 계산을 하고나서도 사람이 볼 수 있는 형태로 나타내야 하는데..
나타내는 모니터 등의 기계 또한 컴퓨터의 일종이니 우리가 말하는 "가나다"를 못 알아듣는다
그래서 미리 1=="가" / 2=="나"로 표현해줘라는 식으로 기계에 입력해놨다
그러다보니... 어떤 모니터는 1=="가"라고 알고 있고 어떤 모니터는 2=="가"라고 알고 있어서 맞지가 않더라
그래서 국제 표준을 정해버렸다
정리하면, 숫자와 문자를 일대일 매칭시키는 rule을 우리는 문자표라고 한다
최초의 예로는, 그 유명한 ASCII 코드표가 있다
그러던 중.. 문제가 생겼다.
영어만 고려되어 있다보니 비영어권 나라의 언어는 표현이 안되더라
비영어권 언어를 위한 문자표도 필요해졌다
여기서 또 문제가 생겼다. 서로 표준을 자처하는 문자표들이 우후죽순 생겨나며 혼란을 야기했다
그래서 나온게, 모든 언어를 하나의 문자표로 표현하자
유니코드이다
사실 유니코드에는 근본적인 문제점이 있다
영어는 1Byte / 한글은 2Byte / 뭐 다른언어는 3Byte 이렇게 각 언어에서 경우의 수가 달라 크기가 가변적이다
이는 컴퓨터 입장에서 굉장한 혼란이다. 언제 1B이고 언제 2B인거야?
그래서 읽어야 하는 문자 앞에 어떤 표시를 하게 되었다
1B / 2B / 3B를 위한 서로 다른 표시를 정하고 각 문자 앞에 붙이도록 약속하였다
이 약속을 우리는 인코딩이라고 부른다
즉, 크기가 가변적인 유니코드로만 저장하면 읽을 수가 없으니
크기 정보가 있는 어떤 표를 추가로 저장하게 되었더라~
그게 인코딩이다
그런데 이 인코딩이 사실은 여러 종류가 있다
그게 UTF-8 / UTF-16 등이다
유니코드를 사용하는 한... 인코딩 방식만 맞춰주면 읽는데 문제가 없을 것이다
한글이 깨지는 현상 중 가장 많이 겪게 되는 경우가 무엇이냐면,
EUC-KR로 인코딩된 것을 UTF-8로 읽는 경우이다
EUC-KR? 이게 뭘까?
먼저 배경을 설명하면,
윈도우가 한글 표현에 유니코드를 안 쓰고 KSX1001을 택했다
KSX1001을 인코딩한게 EUC-KR이란 것이다
문자표도 다르고 인코당 방식조차 달라서 당연히 호환이 안된다
예로, 우리 모두는 한글 윈도우를 쓰고 있으므로 대부분 ECU-KR로 인코딩하는데
웹에서는 보통 UTF-8을 써서 웹 개발자라면 따로 인코딩을 해야하는 경우가 있다
인터넷이 안되는 어떤 기관에 주소검색을 납품해야 하는 상황이다.
보통 인터넷이 되면 API로 불러오면 되는데 인터넷이 안되므로 자체 DB에 모든 주소록을 갖고 있어야 한다
전체 주소록이 너무 크기 때문에 한글로 된 주소를 Byte코드로 읽어서 실제론 숫자로 저장하는 과정을 중간에 넣었다. (읽을 때는 반대로)
그런데 이게 내 컴퓨터에선 잘 되는데 서버에서는 안 되더라. 문제가 뭘까?
숫자로 변환하는데 JAVA의 String.getBytes( )라는 메소드를 사용했는데
이 메소드가 알고보니 현재 시스템의 디폴트 인코딩 방식으로 Byte코드를 뽑도록 되어 있었다
그래서 내 컴퓨터에선 UTF-8을 기본으로 세팅해놨으니 유니코드로 반환되는데
일반 한글 윈도우인 서버에서는 EUC-KR이 디폴트라 문자표가 달라졌다