X(트위터) 280자, 한글은 왜 140자에서 막힐까

X(옛 트위터)에 한글로 글을 쓰다가 "280자라더니 절반도 못 썼는데 막힌다"는 경험을 한 분을 위한 글입니다. 결론부터 말하면 X의 280자는 글자 수가 아니라 가중치 합계이고, 한글은 한 글자가 2로 세어집니다.
그래서 한글만 쓰면 140자에서 한도에 닿습니다. 링크는 또 다른 규칙을 따라 주소 길이와 상관없이 23자로 계산됩니다.
요약 ① X의 한도는 가중치 280입니다. 기본 가중치가 2이고, 라틴 문자·숫자·기본 문장부호 등 일부 구간만 1입니다. ② 한글·한자·가나·이모지는 모두 2라서, 한글만 쓰면 140자에서 막힙니다. ③ URL은 t.co로 감싸지므로 실제 길이와 무관하게 항상 23자로 계산됩니다.
280자인데 왜 절반에서 막힐까
한글로 공지 글을 쓰다가 입력창이 더 이상 받아주지 않아, 세어 보니 140자 남짓인 경우가 대표적입니다. 같은 자리에 영문으로 쓰면 280자까지 들어갑니다.
버그가 아니라 설계입니다. X는 글자 하나하나에 가중치를 매기고, 그 합계가 280을 넘지 않는지 봅니다. 문자 수를 세는 게 아니라 가중치를 더하는 방식입니다.
기본 가중치는 2입니다. 그리고 정해진 몇 개 구간에 속한 문자만 예외적으로 1이 됩니다. 한글은 그 예외 구간 바깥에 있어서 2로 세어집니다.
이 280 한도는 일반 계정 기준입니다. X 유료 구독을 쓰면 한 게시물에 훨씬 긴 글을 올릴 수 있고, 이때는 앞부분만 타임라인에 보이고 나머지는 더 보기로 접힙니다. 아래 계산 규칙은 280 한도가 적용되는 경우를 다룹니다.
도구 없이 직접 세는 방법
규칙은 세 가지뿐이라, 알고 나면 손으로도 어림할 수 있습니다.
1단계 — 문자마다 1인지 2인지 가른다
X가 공개한 문자 가중치 설정 파일 기준으로, 가중치가 1인 코드포인트 구간은 아래 넷뿐입니다. 나머지는 전부 기본값 2입니다.
| 코드포인트 구간 | 무엇이 들어가나 |
|---|---|
| U+0000 ~ U+10FF | 영문·숫자·기본 문장부호·공백, 라틴 확장, 그리스·키릴 등 |
| U+2000 ~ U+200D | 여러 종류의 공백 문자, 폭 없는 결합 문자 |
| U+2010 ~ U+201F | 하이픈·대시류와 둥근 따옴표 |
| U+2032 ~ U+2037 | 프라임 기호류 |
여기서 눈여겨볼 지점은 첫 구간이 U+10FF에서 끊긴다는 것입니다. 한글 자모 영역이 바로 그다음 U+1100에서 시작하고, 우리가 실제로 입력하는 완성형 한글('가'는 U+AC00)은 훨씬 뒤에 있습니다. 즉 한글은 어느 쪽으로도 1이 되는 구간에 들어가지 않습니다.
한자·히라가나·가타카나·이모지도 같은 이유로 2입니다. 반대로 영문·숫자·공백·마침표·쉼표는 1입니다.
2단계 — URL은 23으로 갈아 끼운다
X는 글에 들어간 모든 링크를 t.co 단축 주소로 감쌉니다. 그래서 원래 주소가 짧든 길든 한 개당 23자로 계산됩니다.
https://example.com도 23, 뒤에 긴 경로가 붙은 주소도 23입니다. 링크를 두 개 넣으면 46이 됩니다.
3단계 — 이모지는 결합 여부와 상관없이 2
이모지는 하나당 2입니다. 피부톤이 붙은 이모지나, 여러 이모지를 결합해 만든 가족 이모지처럼 겉보기에 하나인 그림도 2로 계산됩니다.
이 세 규칙을 코드로 옮기면 아래처럼 됩니다. 브라우저 개발자 도구(대개 F12)의 콘솔에 붙여 넣으면 바로 확인할 수 있습니다.
const W = (c) =>
(c <= 0x10FF || (c >= 0x2000 && c <= 0x200D) ||
(c >= 0x2010 && c <= 0x201F) || (c >= 0x2032 && c <= 0x2037)) ? 1 : 2;
const weighted = (s) => [...s].reduce((n, ch) => n + W(ch.codePointAt(0)), 0);
weighted("안녕하세요"); // 10 (한글 5자 × 2)
weighted("Hello"); // 5 (영문 5자 × 1)
이 짧은 코드는 1·2 구분만 다룹니다. 링크를 23으로 바꾸고 결합 이모지를 하나로 묶는 부분까지 손으로 처리하려면 매번 문장을 잘라 세어야 합니다.
저희 도구로 확인하기. 글을 붙여 넣으면 가중 글자수·남은 글자수·실제 문자수와 인식된 링크 개수가 한 화면에 표시되고, 남은 글자수가 20 이하로 내려가면 막대가 색으로 바뀝니다.
설치·회원가입 없이 브라우저 안에서 바로 계산되며, 입력한 글은 서버로 전송되지 않습니다.

자주 어긋나는 지점
숫자가 예상과 다르게 나올 때는 대개 아래 중 하나입니다.
| 입력 | 어떻게 세어지나 |
|---|---|
말줄임표 … (U+2026) | 1이 되는 구간 밖이라 2 |
붙임표 — – (U+2014, U+2013) | 대시 구간 안이라 1 |
둥근 따옴표 “ ” ‘ ’ (U+201C, U+2018 등) | 같은 구간이라 1 |
마침표 세 번 ... | 마침표 각각 1이라 합계 3 |
| 해시태그 | # 와 뒤 글자를 평소 규칙대로 계산 |
| 사진·동영상 첨부 | 공식 앱에서 붙인 미디어는 0 |
| 답글 맨 앞의 자동 멘션 | 자동으로 붙는 부분은 0, 직접 적은 멘션은 정상 계산 |
말줄임표 하나와 마침표 세 개는 화면에서 비슷해 보이지만 계산은 2와 3으로 갈립니다. 반대로 대시와 둥근 따옴표는 한글 문장에 섞여 있어도 1로 세어지는 쪽입니다.
한 가지 더 있습니다. X는 글자를 셀 때 유니코드 NFC 형태로 정규화합니다. 한글이 자모 단위로 분리된 상태(NFD)로 붙여 넣어져도 X 쪽에서는 완성형 기준으로 세어집니다.
정리
- X의 280은 글자 수가 아니라 가중치 합계입니다. 기본 가중치는 2입니다.
- 가중치 1인 구간은 U+0000
U+10FF, U+2000U+200D, U+2010U+201F, U+2032U+2037 넷뿐입니다. - 한글·한자·가나·이모지는 2라서, 한글만 쓰면 140자에서 한도에 닿습니다.
- 링크는 t.co로 감싸져 실제 길이와 무관하게 개당 23자입니다.
- 이모지는 피부톤·결합 여부와 상관없이 하나당 2로 계산됩니다.
- 말줄임표는 2, 대시·둥근 따옴표는 1처럼 문장부호마다 갈리는 지점이 있습니다.
설치·회원가입 없이 브라우저 안에서 바로 계산되며, 입력한 글은 서버로 전송되지 않습니다.
자주 묻는 질문
한글 140자가 정확한 한도인가요?
한글만 썼을 때의 한도입니다. 정확한 규칙은 "가중치 합계 280"이고, 한글이 한 자당 2이므로 280 ÷ 2 = 140이 됩니다. 공백·숫자·영문·마침표는 1로 세어지기 때문에, 이런 문자가 섞이면 실제로 쓸 수 있는 글자 수는 140보다 늘어납니다.
링크를 짧게 줄이면 글자수가 줄어드나요?
줄지 않습니다. X가 모든 링크를 t.co로 감싸기 때문에, 원래 주소가 몇 자든 한 개당 23자로 고정됩니다. 단축 URL 서비스를 거쳐 짧게 만들어 넣어도 결과는 같습니다. 반대로 아주 긴 주소를 그대로 붙여도 23자만 차지합니다.
이 도구의 이모지 계산이 X와 다를 수 있나요?
이모지 중 일부에서 다를 수 있습니다. X는 피부톤이나 결합 문자로 이어 붙인 이모지도 하나로 보고 2를 매기지만, 이 도구는 코드포인트 단위로 세기 때문에 그런 이모지는 더 크게 나옵니다. 이모지 뒤에 색 표시용 문자가 따라붙는 경우(하트 등)도 마찬가지입니다. 실제보다 여유를 적게 잡는 방향이라 이 숫자를 믿고 썼다가 초과로 잘릴 일은 없습니다.
입력한 글이 서버로 전송되나요?
아니요. 이 도구의 계산은 전부 브라우저 안에서 이뤄지며, 입력한 글은 서버로 전송되거나 저장되지 않습니다. 아직 올리지 않은 초안을 붙여 넣어 길이를 재 봐도 외부로 나가지 않습니다.
