[Data] 글자가 깨져서 보이는건 왜일까?
업데이트:
문자열 인코딩
파일을 읽었는데, 갑자기 글자가 깨진 화면을 보면 기분이 썩 좋지 않습니다.
하지만, 이젠 그런 일을 만나더라도 문자열 인코딩을 알고, 잘 대처해봅시다.
문자열 인코딩은 2진법을 사용하는 컴퓨터가 인간의 언어를 일정한 규칙에 따라 2진수로 변환하는 방식
입니다.
간혹 글자까 깨지는 이유는
=> 운영체제, 개발환경, 연동되는 서비스나 라이브러리 등에 맞는 인코딩 방식을 선택하지 못했기 때문입니다.
그럴 때는 적절한 인코딩 방식을 설정해서 해결해봅시다.
ASCII코드 vs 유니코드
문자열 인코딩에 대해 정리하면서, 지금 알게 되어 너무 다행이라고 생각했습니다. 이 둘의 차이점을 설명하라는 질문을 만난다면, 땀을 흘리고 있을 저가 그려집니다.
다음 표를 보면서 설명하겠습니다.
문자 집합 | 인코딩 방식 |
---|---|
ASCII (영어, 숫자, 특수문자) |
ASCII코드 (대소문자, 숫자, 특수문자를 128개의 수에 맵핑) |
유니코드 (모든언어 집합) |
UTF-8 (윈도우, 자바 제외 모든 환경 표준, JSON은 이것만 가능) UTF-16 (윈도우, 자바 환경 표준) (그래서 자바의 char가 2바이트!!) |
위의 표를 보면 알듯이, 엄밀히 말하면, ASCII코드는 인코딩 방식을, 유니코드는 문자 집합을 의미합니다. 다만 기억할 것은, 아스키코드는 영어만 표현할 수 있고, 유니코드는 모든 언어를 표현할 수 있다고 기억하면 됩니다.
추가 tip1)
인코딩 방식 | 설명 |
---|---|
EUC-KR | 한글을 표현하기 위한 규칙(옛날 방식) ‘가’, ‘나’ 와 같이 완성형 글자로 맵핑되어 있어서 표현 못하는 한국말이 있음 |
CP949 | EUC-KR의 확장판 |
cf) MySQL과 완벽히 화환되는 문자 집합을 쓰고 싶다면, utf8mb4를 사용하세요~!!
추가 tip2)
‼️실제 문자열 길이와 컴퓨터가 할당하는 버퍼 크기는 항상 다를 수 있다‼️
영어, 숫자, 특수문자를 합쳐도 100개 정도밖에 되지 않기 때문에, 1바이트 = 8비트 = 256개 면 충분히 표현할 수 있습니다.
하지만, 한글의 경우, 완성형 글자가 수천개에 달하기 때문에, 2바이트 = 16비트 = 65536개 는 되어야 충분히 표현할 수 있습니다.
따라서,
- 영어 = 1바이트
- 한글 = 2바이트
입니다.
그래서 실제 문자열의 길이와 버퍼의 길이가 다른 경우가 발생하게 되는데, 문자열 길이와 버퍼 크기가 동일하게 취급되어 발생하는 버그가 생각보다 많다고 합니다.
여러분 오늘도 고생했어요~~ ⭐️⭐️⭐️⭐️