다됨

바이트와 글자 수는 왜 다를까요?

글자 수 세기 결과를 보면 "글자 수 10자, 바이트 30" 같은 숫자가 함께 나와요. 같은 글인데 숫자가 왜 이렇게 다를까요? 컴퓨터가 글자를 저장하는 방식 때문이에요. 쉬운 말로 풀어볼게요.

글자 수와 바이트는 세는 대상이 달라요

글자 수는 사람이 읽는 글자를 하나씩 센 값이에요. "안녕"은 2자예요. 바이트는 컴퓨터가 그 글자를 저장할 때 쓰는 공간의 크기예요. 1바이트는 8개의 0과 1로 이루어진 저장 단위예요.

컴퓨터는 글자를 숫자로 바꿔서 저장해요. 이때 어떤 규칙으로 바꾸는지를 인코딩이라고 해요. 인코딩에 따라 같은 글자도 1바이트가 되기도 하고 3바이트가 되기도 해요.

UTF-8에서는 한글이 3바이트

지금 웹과 대부분의 프로그램은 UTF-8이라는 인코딩을 써요. UTF-8은 글자마다 1바이트에서 4바이트까지 쓰는 방식이에요. 규격 문서(RFC 3629)에 정해진 규칙을 요약하면 이래요.

  • 영어 알파벳, 숫자, 기본 기호: 1바이트
  • 라틴 확장 문자, 그리스 문자 등: 2바이트
  • 한글 음절, 한자 대부분: 3바이트
  • 대부분의 이모지와 일부 옛 한자 등: 4바이트

그래서 "안녕"은 UTF-8로 6바이트, "hi"는 2바이트예요. 한글이 많은 글일수록 바이트가 글자 수의 3배에 가까워져요.

EUC-KR에서는 한글이 2바이트

EUC-KR은 예전 한국어 시스템에서 많이 쓰던 인코딩이에요. 영어와 숫자는 1바이트, 한글은 2바이트로 저장해요. 오래된 관공서·금융 사이트나 문자 메시지에서 "한글 1자 = 2바이트"라는 계산이 나오는 이유예요.

EUC-KR이 바탕으로 삼은 KS X 1001에는 자주 쓰는 완성형 한글 2,350자만 들어 있어요. 그래서 "걐", "쌰", "쓔"처럼 목록에 없는 한글은 EUC-KR로 표현하지 못해요. 이를 넓혀 8천여 자를 더한 CP949 같은 인코딩도 있어요.

문자 메시지는 바이트로 길이를 재요

국내 문자 메시지 서비스 안내를 보면 단문(SMS)은 90바이트, 즉 한글 45자까지예요. 이를 넘으면 장문(LMS)으로 바뀌고, 장문은 2,000바이트(한글 약 1,000자)까지라고 안내해요. 이때 한글은 2바이트, 영어·숫자·공백은 1바이트로 계산해요.

다만 이 기준은 문자 발송 업체의 안내에서 확인한 값이에요. 통신사마다 약관 기준이 다를 수 있고, 최신 통신사 약관 수치는 확인하지 못했어요.

이모지는 왜 특별할까요?

이모지는 글자 수를 셀 때도 헷갈려요. 자바스크립트의 문자열 길이(length)는 UTF-16 코드 단위를 세기 때문에, 웃는 얼굴 이모지 하나가 2로 나와요. MDN 문서도 이 차이를 설명하고 있어요.

가족 이모지처럼 여러 이모지를 이어 붙인 글자는 더 복잡해요. 화면에는 하나로 보이지만 안에는 여러 문자가 들어 있어요. 사람이 보는 대로 하나로 세려면 "글자 묶음(grapheme)" 단위로 세야 해요.

글자 수 세기는 화면에 보이는 글자 묶음 단위로 글자 수를 세요. 그래서 가족 이모지도 1자로 나와요. 반면 다른 서비스는 같은 이모지를 2자 이상으로 셀 수 있어요.

예시로 직접 계산해 보기

"안녕하세요 Hi!"라는 글을 예로 들어 볼게요. 한글 5자, 공백 1자, 영어와 느낌표 3자라서 글자 수는 9자예요.

  • UTF-8: 한글 5자 × 3바이트 = 15바이트, 공백과 영어·기호 4자 × 1바이트 = 4바이트, 합쳐서 19바이트예요.
  • EUC-KR: 한글 5자 × 2바이트 = 10바이트, 나머지 4바이트를 더해 14바이트예요.

같은 9자인데 저장 방식에 따라 19바이트도 되고 14바이트도 되는 거예요. 바이트 제한이 "100바이트"라고만 적혀 있으면, 어느 인코딩인지에 따라 한글을 33자까지 쓸 수도 있고 50자까지 쓸 수도 있어요.

바이트 제한이 있을 때 확인할 것

  • 어떤 인코딩 기준인지 안내문을 확인해요. 같은 글도 UTF-8과 EUC-KR에서 바이트가 크게 달라요.
  • 이모지와 특수문자는 예상보다 많은 바이트를 차지할 수 있어요.
  • 줄바꿈도 바이트를 차지해요. 시스템에 따라 줄바꿈이 1바이트 또는 2바이트로 저장돼요.

다됨의 글자 수 세기 결과에는 UTF-8 바이트와 EUC-KR 바이트가 함께 나와요. EUC-KR 값은 한글이 아닌 문자도 2바이트로 계산하는 근사치라서 참고용으로 봐 주세요.

참고