
가끔 프로젝트를 투닥거리다보면 properties 파일같은 곳에서 한글이 와장창 깨지는 문제가 발생했는데,
보통은 IDE 설정에서 인코딩 방식이 IDE 기본 설정으로 되어있어서, 그 부분을 UTF-8로 바꿔주는 식으로 해결하는걸 경험했을 것입니다.
(저도 예전에 인텔리제이에 익숙해지지 않았을 때, properties 파일에서 한글이 몽땅 물음표로 나왔던 적이 있었죠 음음)
[Spring] Validation (검증) 처리 방법 및 properties 파일의 한글이 출력되지 않는 문제 해결 방법
안녕하딤니카 그간 폐관수련으로 공부를 소홀히 하다가 다시 미라클모닝도 시작하고... 열심히 공부 중인 재영입니다 최근에는 스프링의 검증 처리를 하는 방법에 대해 자세히 배우고 있는데
chuuuu1224.tistory.com
오늘은 제가 CS 공부를 하면서 문자열을 처리하는 방식과 유니코드, 그리고 UTF-8 방식을 정리하면서,
대체 UTF-8을 왜 쓰게 되었는지 그 일대기를 정리해보겠습니다.
그럼~ 시작!
1. 문자 집합과 인코딩
우리가 사용하는 컴퓨터는 0과 1만 이해할 수 있는데, 우리가 사용하는 영어나, 한글을 컴퓨터에게 전달하고 싶을 때 이 문자를 코드화하는 과정이 필요합니다. 이 과정을 인코딩(encoding) 이라고 합니다. "문자 표현" 에 국한해서 인코딩 관련 용어를 정리해보겠습니다.

- 문자 집합 (character set) : 컴퓨터가 이해할 수 있는 문자의 모음
- 인코딩 (encoding) : 코드화 하는 과정, 문자를 0과 1로 이루어진 문자 코드로 변환하는 과정
- 디코딩 (decoding) : 코드를 해석하는 과정, 0과 1로 표현된 문자 코드로 문자를 변환하는 과정
2. 문자를 인코딩하는 방식
2-1. 아스키 코드
먼저, 가장 대표적인 문자 인코딩 방법에는 아스키 코드(ASCII) 가 있습니다.
아스키 코드는 American Standard Code for Information Interchange (미국정보교환표준부호) 의 약자입니다.
초창기 문자 집합 중 하나이며, 영문 알파벳과 키보드에 있는 문자들을 정리한 대표적인 문자 인코딩 방식입니다. 아스키 코드는 0에서 127까지 총 128개의 문자를 나타낼 수 있습니다. 7비트로 하나의 문자를 표현하며, 8비트 중 1비트는 오류 검출을 위해 사용되는 패리티 비트(parity bit) 로 구성되어 있습니다.

아스키 코드의 장점은 간단한 인코딩을 할 수 있다는 것인데, 그러나 영문 알파벳을 기준으로 만들었기 때문에 한글을 포함한 다른 언어 문자, 다양한 특수 문자를 표현할 수 없다는 것이 큰 단점입니다.
또한, 아스키 코드는 7비트로 하나의 문자를 표현한다고 했죠? 그 말은 128개보다 많은 문자를 표현할 수 없다는 것입니다. 8비트 확장 아스키(extended ASCII) 가 등장하긴 했지만, 여전히 문자를 표현하기에는 부족합니다.
2-2. 한글은 어떻게 인코딩하는데?
아스키 코드로는 한글을 컴퓨터에게 전달할 수 없습니다. 이런젠장... 한글이 얼마나 좋은 문자인데...
그래서 한글을 위한 인코딩이 필요합니다. 알파벳을 이어 쓰면 단어가 되는 영어와는 달리, 초성, 중성, 종성의 조합으로 이루어져있는 한글이라, 인코딩 방식이 나눠집니다. 완성형 인코딩 방식과 조합형 인코딩 방식으로 나눠져서 존재합니다.

이런식으로 한글을 이진수로 인코딩해서 컴퓨터에 전달하게 됩니다. 그러면 한글에도 아스키 코드처럼 인코딩 방식이 따로 정해져있냐? 맞습니다.
대표적으로는 EUC-KR 이라는 방식이 있는데, 이 방식은 완성형 인코딩 방식이며,
KS X 1001 KS X 1003 문자집합 기반의 한글 인코딩 방식입니다. 글자 하나 하나에 2바이트 크기의 코드를 부여해서, 4자리 16진수로 한글을 표현합니다.

이런식으로 각 글자마다 고유한 코드가 있어서, 이 코드를 조합해서 한글을 컴퓨터에게 전달하게 됩니다.
EUC-KR 방식은 2300여 개의 한글을 표현할 수 있지만, 쀏, 뙠, 휔 같은 기상천외한 한글은 표현 불가능하다는 단점이 있습니다... 왜냐면 저런건 EUC-KR에 등록되어 있지 않은 한글이라서요 ㅠㅠ 실제로 EUC-KR 방식을 사용하는 프로그램에서 이름을 인식할 수 없어서 핸드폰 명의며 은행 의료보험 이런것도 다 전산에 등록이 안되서 불편함을 호소한 분이 계셨다고 합니다.
그리고 이렇게 언어별로 인코딩을 국가마다 하게 되면, 다국어를 지원하는 프로그램을 개발할 때에 언어별 인코딩 방식을 모두 이해한 상태에서 프로그램을 개발해야 하는 문제도 생깁니다. 그래서 이 문제를 해결하기 위해 유니코드 인코딩 방식을 사용합니다.
3. 유니코드 문자 집합과 UTF-8
한글, 영어, 일본어 등등과 화살표, 이모티콘까지 통일된 문자 집합이라는 유니코드 라는 방식을 사용할 수 있습니다. 유니코드는 전 세계의 모든 문자를 컴퓨터에서 일관되게 나타내고 처리하기 위한 국제적인 표준 문자 전산 처리법을 말합니다.
이 유니코드를 인코딩하는 방식이 바로 UTF-8, UTF-16, UTF-32 등등 입니다.

이런식으로 문자 하나하나에 고유한 16진수가 부여되어 있는데, 이렇게 부여된 16진수를 유니코드 문자에 부여된 고유한 값이라고 해서 유니코드의 코드 포인트 라고 합니다. 이렇게 각 문자에 부여된 유니코드의 코드 포인트를 그대로 인코딩 값으로 쓰는 게 아니라, 다양한 인코딩 방법을 이용해서 인코딩을 진행합니다. 이 인코딩 방식을 UTF-8, UTF-16, UTF-32... 라고 합니다.
여기서 가장 대중적인 유니코드 인코딩 방식은 UTF-8 인데요,
UTF 는 Unicode Transformation Format (유니코드 인코딩 방법) 의 약자이며, UTF-8 인코딩은 가변 길이 인코딩입니다.
인코딩된 결과가 1바이트 ~ 4바이트 이고, 인코딩 결과가 몇 바이트가 될 지는 유니코드에 부여된 코드 포인트에 따라 달라집니다.

아까 확인했던 유니코드 코드 포인 네 자리를 이진수로 변환하고, 표에 나와있는 X 표시에 맞춰서 그 이진수를 집어 넣으면 되는데, 변환 결과를 쭉 이어 붙이면 UTF-8로 인코딩된 결과라고 보시면 됩니다.

https://onlinetools.com/utf8/convert-utf8-to-binary 여기 사이트에서 문자를 입력하면 UTF-8 방식으로 인코딩한 결과를 바로 확인할 수 있습니다.
4. 정리
이렇게 문자를 컴퓨터에게 전달할 때 컴퓨터가 알아들을 수 있는 언어로 변환하는 인코딩 과정, 그리고 인코딩 방식에 대한 종류를 알아봤습니다. 제가 예전에 겪었던 파일에 적은 문자가 와장장 깨진다! 싶으면 문자 인코딩 방식이 잘못 설정되어있거나, 그 인코딩의 문자 집합에 속하지 않은 문자가 사용된 것이 아닌지 의심해볼 수 있을 것입니다!
그럼 여기서 글을 마무리하겠습니다. 그럼 20000~
[자료 출처]
강민철, 《혼자 공부하는 컴퓨터 구조+운영체제》, 한빛미디어, 2022
인프런 - 개발자를 위한 컴퓨터공학 1 : 혼자 공부하는 컴퓨터구조 + 운영체제
🍀
좋아하는 것을 계속 좋아하세요!
반드시 행복해집니다
백엔드 개발자가 되고 싶어서 열심히 헤딩 중인 재영입니다 :-)
[Github] https://github.com/chujaeyeong
[E-mail] chujy1224@gmail.com
'Study > 컴퓨터구조, 운영체제' 카테고리의 다른 글
| 프로세스 상태와 계층 구조에 대해 정리해보자 (0) | 2025.01.07 |
|---|---|
| 프로세스의 개요와 PCB, 메모리 영역에 대해 정리해보자 (0) | 2025.01.07 |
| RAID의 정의와 종류를 정리해보자 (0) | 2025.01.05 |
| 메모리의 물리 주소와 논리 주소 정리 (2) | 2025.01.03 |
| CPU의 작동 원리 - 명령어 사이클과 하드웨어 인터럽트 처리순서 (0) | 2024.12.28 |