[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바이트

입니다.

그래서 실제 문자열의 길이와 버퍼의 길이가 다른 경우가 발생하게 되는데, 문자열 길이와 버퍼 크기가 동일하게 취급되어 발생하는 버그가 생각보다 많다고 합니다.



여러분 오늘도 고생했어요~~ ⭐️⭐️⭐️⭐️

카테고리:

업데이트: