바로 사용하기 — 글자 수 세기

원고 분량을 알려 달라는 말을 들으면 어떤 숫자를 내놓으시나요?
번역 의뢰는 원문 한자 수로, 원고료는 200자 원고지 장수로, 제출 양식은 공백 포함 글자 수로 묻습니다.
같은 글을 두고 기준만 셋이에요.

그런데 워드프로세서의 글자 수 세기는 한글·한자·영문·문장부호를 한데 묶어 셉니다.
원문과 번역문이 한 파일에 섞여 있으면 원문 분량만 따로 알기 어렵고요.
옛한글이 든 원고라면 자모가 낱낱이 세어져 숫자가 크게 부풀기도 합니다.

이 도구는 한 번 붙여넣으면 세 가지를 한꺼번에 보여 줍니다.

  • 한자 수 — 유니코드 한자 범위에 드는 글자만
  • 언어별 글자 수 — 한글(옛한글 포함), 한자, 가나, 영문·라틴 문자, 키릴, 숫자, 문장부호, 공백
  • 200자 원고지 장수 — 한글 프로그램의 문서 통계와 같은 방식으로

원문 행만 고르거나, 주석처럼 괄호로 묶인 부분을 빼고 셀 수도 있습니다.

사용법

기본 순서

  1. 입력 텍스트에 셀 텍스트를 붙여넣거나 파일을 불러옵니다.
  2. 필요하면 아래 옵션을 켭니다.
  3. [세기] 를 누릅니다.

결과 읽기

결과는 이렇게 글처럼 나옵니다.

총 글자 수 1,400자 (공백 제외 1,120자)
   한자:             400자  (그중 부수 40자)
   한글:             360자
   영문·라틴 문자:   120자
   숫자:             120자
   문장부호·기호:     80자
   공백:             280자
200자 원고지 8장 (공백 제외 8장)

맨 위에 전체 분량을, 그 아래에 갈래별 글자 수를, 마지막에 원고지 장수를 적습니다.
갈래를 모두 더하면 총 글자 수와 같습니다.
갈래별 숫자는 오른쪽 정렬해서 자릿수를 세로로 맞췄어요. 필요한 갈래만 골라 더할 때 손으로 셈하기 편합니다.

  • 글자가 하나도 없는 갈래는 적지 않습니다. 없는 갈래까지 늘어놓으면 정작 있는 갈래가 눈에 잘 안 들어오거든요.
  • (그중 부수) 는 부수 옵션을 켰을 때만 붙습니다.
  • 공백 제외 원고지 장수는 문단마다 빈칸·탭을 지운 뒤 같은 원고지 규칙으로 센 값입니다. 한글 프로그램에는 없는 값이라 아래 ‘200자 원고지 장수’ 항목에서 따로 설명합니다.

어떤 글자를 어느 갈래로 세는지는 아래 ‘언어별 글자 수’ 항목에 정리했습니다.

시작 문자열이 원고와 맞지 않으면 고를 행이 없으니 총 글자 수가 0으로 나옵니다.
숫자가 이상하게 작다면 시작 문자열부터 확인해 보세요.

텍스트나 옵션을 고치면 이전 결과는 바로 사라집니다.
고친 뒤의 텍스트와 맞지 않는 숫자가 남아 있으면 헷갈리기 때문입니다.

특정 문자열로 시작하는 행만 세기

원문과 번역문이 행 단위로 번갈아 나오는 원고가 있습니다.

((OR))學而時習之不亦說乎
((TR))배우고 때때로 익히면 또한 기쁘지 아니한가.
((OR))有朋自遠方來不亦樂乎
((TR))벗이 먼 곳에서 찾아오면 또한 즐겁지 아니한가.

전체를 세면 번역문까지 들어가서 원문 분량을 알 수 없죠.
이 옵션을 켜면 입력한 문자열로 시작하는 행만 셉니다.
한자 수만이 아니라 언어별 글자 수와 원고지 장수도 고른 행으로만 셉니다.
기본값은 ((OR)) 이고, 원고에 맞게 바꿔 쓰면 됩니다.

몇 가지 기준이 있습니다.

  • 행의 맨 앞에서 바로 시작해야 합니다. 앞에 공백이 있는 행은 고르지 않아요.
    공백까지 너그럽게 봐주면, 본문 중간에 우연히 같은 문자열이 들어간 행도 걸릴 수 있기 때문입니다.
  • 시작 문자열 자체는 세지 않습니다. ((甲)) 처럼 한자가 든 표시를 쓰더라도 그 표시는 분량이 아니니까요.
  • 옵션을 켜고 칸을 비워 두면 에러가 납니다. 빈 문자열은 모든 행에 맞으니, 사실상 옵션을 끈 것과 같아 실수일 가능성이 크거든요.

괄호로 묶인 범위를 지우고 세기

원문 중간에 주석이나 교감 표시가 끼어 있는 경우가 있습니다.

學而時習之{註:時는 때때로이다}不亦說乎

주석은 원문 분량이 아니죠.
이 옵션을 켜면 괄호와 그 안의 내용을 지운 뒤 셉니다.
기본값은 {...} 입니다.

괄호는 여는괄호...닫는괄호 형식으로 적습니다.
가운데 ... 을 기준으로 앞뒤를 나누기 때문에, 한 글자가 아닌 괄호도 쓸 수 있어요.

적는 값지우는 범위
{...}{ 부터 } 까지
[[...]][[ 부터 ]] 까지
<!--...-->HTML 주석
|...|| 와 다음 | 사이

고급 모드 (정규식)

기본 모드로는 표현하기 어려운 조건이 있습니다.
((OR)) 앞에 들여쓰기가 들어간 원고라든가, 원문 표시는 제각각인데 번역 표시만 일정한 원고 같은 경우죠.
[고급 모드 (정규식)] 를 켜면 두 옵션을 정규식으로 적을 수 있고, 행 조건을 뒤집는 [반대로] 가 생깁니다.

기본 모드의 값이 정규식으로 옮겨집니다

고급 모드를 처음 켜면, 기본 모드에 적어 둔 값을 같은 뜻의 정규식으로 바꿔 채워 둡니다.

기본 모드고급 모드에 채워지는 값
((OR))^\(\(OR\)\)
{...}\{[\s\S]*?\}

빈 칸에서 시작하면 정규식을 어떻게 적어야 할지 막막하잖아요.
같은 조건이 정규식으로 어떻게 적히는지 보고, 거기서 고쳐 나가면 됩니다.
두 모드의 칸은 따로 있어서, 모드를 오가도 각자 적은 값이 그대로 남습니다.

행 조건

행마다 정규식을 검사해서 맞는 행만 셉니다.
기본 모드와 달리 맞은 행은 전체를 셉니다.
정규식은 행 안 어디에든 맞을 수 있어서, 맞은 부분을 빼면 오히려 세야 할 글자를 잃기 때문이에요.
예를 들어 [一-鿿]{5,} (한자가 다섯 자 넘게 이어지는 행)로 고른 행에서 그 다섯 자를 빼고 세면 곤란하겠죠.

정규식고르는 행
^\s*\(\(OR\)\)앞에 공백이 있어도 ((OR)) 로 시작하는 행
^\(\((OR|原)\)\)((OR)) 이나 ((原)) 으로 시작하는 행
^\d+\.1. 2. 처럼 번호로 시작하는 행

반대로

[반대로] 를 켜면 정규식에 맞지 않는 행을 셉니다. grep의 -v 와 같습니다.
^\(\(TR\)\) 에 [반대로]를 켜면 번역 행만 빼고 나머지를 모두 세는 식이에요.
^$ 에 [반대로]를 켜면 빈 행만 빼고 셉니다. 빈 문단도 원고지 한 줄을 차지하니, 빈 줄을 빼고 장수를 셀 때 쓸 수 있어요.

지우기

정규식에 맞는 부분을 모두 지운 뒤 셉니다.
기본 모드의 괄호와 달리 문서 전체에 걸고, ^ $ 는 각 행의 처음과 끝에 맞습니다.

정규식지우는 부분
\{[^}]*\}|\[[^\]]*\]{...} 와 [...] 를 함께
^#.*$# 으로 시작하는 주석 행의 내용
<[^>]+>HTML 태그

지운 부분 안의 줄바꿈은 기본 모드와 마찬가지로 남겨 둡니다.

정규식은 겹괄호를 짝지을 수 없고, 짝이 맞지 않는 괄호도 찾아 주지 않습니다.
괄호를 지우는 것이 목적이라면 기본 모드가 더 안전합니다.

정규식 문법

자바스크립트 정규식이며 u 플래그를 켜고 씁니다.
그래서 [\u{20000}-\u{2A6DF}] 처럼 확장 B 이후의 한자도 범위로 적을 수 있고, . 하나가 그런 한자 한 글자에 맞습니다.
대신 u 플래그에서는 문법이 엄격해서 \- 처럼 쓸모없는 이스케이프도 에러가 납니다.
문법이 틀리면 어디가 틀렸는지 에러 메시지로 알려 드립니다.

언어별 글자 수

글자 하나의 기준

화면에 보이는 한 글자를 한 글자로 셉니다.
당연해 보이지만 컴퓨터 안에서는 그렇지 않은 경우가 많아요.

보이는 글자저장된 모습셈
ᄒᆞᆫ (옛한글)첫소리 + 가운뎃소리 + 끝소리, 자모 셋1
ée + 결합 부호 ´1
👨‍👩‍👧이모지 셋을 잇는 문자로 묶은 것1
𠀀 (확장 B 한자)16비트 두 칸 (서로게이트 쌍)1

저장된 단위대로 세면 옛한글 한 음절이 세 글자로, 가족 이모지가 다섯 글자로 잡힙니다.
그래서 브라우저에 들어 있는 글자 나누기 기능(Intl.Segmenter)으로 보이는 글자 단위로 나눠서 셉니다.

줄바꿈은 세지 않습니다.
빈칸과 탭은 공백으로 세고, 공백 제외에서 빠집니다.

갈래

갈래세는 글자
한글현대 한글 음절, 자모(호환용 자모 ㄱ ㅏ 포함), 옛한글 첫가끝 자모, 방점, 한양 PUA 옛한글
한자유니코드 한자 블록 (아래 ‘한자’ 항목)
가나히라가나, 가타카나
영문·라틴 문자영문자, é ü ŏ 같은 로마자 계열 글자, 전각 영문 A. 영어인지 프랑스어인지는 글자만으로 가를 수 없어 함께 셉니다
키릴 문자러시아어 등의 키릴 문자
숫자0–9, 전각 숫자 1 등 십진 숫자
문장부호·기호. , 「」 · … 같은 문장부호, ㉠ ※ 같은 기호, 이모지
공백빈칸, 탭, 전각 빈칸
기타위에 들지 않는 글자. 구결, 아랍·태국 문자 등

원문자 ㉠ 이나 괄호 문자 ㈀ 은 유니코드에서 한글 문자 체계로 분류되지만, 글이 아니라 번호를 매기는 기호라서 문장부호·기호로 셉니다.

옛한글

옛한글은 파일마다 저장 방식이 다릅니다.
이 도구는 두 방식 모두 한글로 셉니다.

유니코드 첫가끝

지금의 표준 방식입니다.
첫소리·가운뎃소리·끝소리 자모를 이어 써서 한 음절을 만들어요.

블록범위
한글 자모U+1100–U+11FF
한글 자모 확장 AU+A960–U+A97F
한글 자모 확장 BU+D7B0–U+D7FF
방점U+302E, U+302F

이어진 자모와 그 뒤의 방점은 한 음절, 한 글자로 셉니다.

한양 PUA

한글 2010 이전의 한글 프로그램이 쓰던 방식입니다.
유니코드의 사용자 영역(PUA)에 옛한글 음절을 하나씩 넣어 두었어요.
예전 문서를 변환한 파일에는 지금도 이 방식이 많이 남아 있습니다.

구간범위셈
완성형 음절U+E0BC–U+EFFF, U+F100–U+F66E한 자가 한 글자
조합형 자모첫소리 U+F784–U+F800, 가운뎃소리 U+F806–U+F864, 끝소리 U+F86A–U+F8F7이어진 첫소리+가운뎃소리(+끝소리)가 한 글자

같은 사용자 영역에 있어도 구결(U+F67E–U+F77C)은 한글이 아니라서 기타로 셉니다.
공백 문자 구간(U+E000–U+E0BB)과 윙딩 기호 구간(U+F000–U+F0FF)도 기타입니다.

사용자 영역은 글꼴마다 쓰임이 제각각이라, 같은 코드라도 다른 글꼴에서는 전혀 다른 글자일 수 있습니다.
그래서 한양 PUA의 옛한글 구간이 아닌 사용자 영역 글자는 기타로 셉니다.
옛한글을 표준 방식으로 바꾸고 싶다면 깨진 한글 복구로 한양 PUA를 첫가끝으로 바꿀 수 있습니다.

한자

유니코드에서 한자 블록에 드는 글자만 셉니다.

블록범위
CJK 통합 한자U+4E00–U+9FFF
확장 AU+3400–U+4DBF
확장 B~JU+20000–U+3347F (블록 사이 빈 곳 제외)
호환용 한자U+F900–U+FAFF
호환용 한자 보충U+2F800–U+2FA1F

다음 글자는 한자처럼 보여도 한자로 세지 않습니다.

  • 〇 (U+3007), 々 (U+3005) — 한자 블록이 아니라 기호 블록에 있습니다. 기타로 셉니다.
  • ⺈ ⼈ 같은 부수 — 글자가 아니라 부수를 나타내는 기호입니다. 기본으로는 문장부호·기호로 세고, 옵션으로 한자에 넣을 수 있습니다(아래).
  • 한자 뒤에 붙는 이체자 선택자(IVS) — 앞 글자의 모양을 고르는 표시일 뿐이라 앞 한자와 함께 한 글자입니다.

부수도 한자로 세기

[부수도 한자로 세기] 를 켜면 부수 블록의 글자도 한자로 셉니다.

블록범위
CJK 부수 보충U+2E80–U+2EFF
강희 부수U+2F00–U+2FDF

옛 문서를 변환하거나 PDF에서 텍스트를 뽑으면, 일반 한자 人 자리에 강희 부수 ⼈ 이 들어오는 일이 꽤 있습니다.
눈으로는 구별이 안 되니 그런 원고에서는 한자 수가 실제보다 적게 나오죠.
이럴 때 옵션을 켜면 빠진 글자를 함께 셀 수 있습니다.

결과의 한자 수에는 부수까지 더한 값이, 그중 부수에는 부수만의 수가 나옵니다.
그중 부수가 0이 아니라면 원고에 부수 글자가 섞여 있다는 신호이기도 해요.

확장 B 이후의 한자도 한 글자로 셉니다

자바스크립트의 문자열 길이(length)는 글자 수가 아닙니다.
16비트 단위의 개수예요.
대부분의 한자는 16비트 하나에 들어가지만, 확장 B 이후의 한자는 U+FFFF를 넘어서 16비트 두 개(서로게이트 쌍)로 저장됩니다.

'天'.length   → 1
'𠀀'.length   → 2

그래서 length 로 세거나 한 칸씩 훑으면 이런 한자가 두 글자로 잡히거나, 반쪽짜리로 갈라져 한자로 인식되지 않습니다.
옛 문헌일수록 확장 영역 한자가 많이 나오니 무시할 수 없는 차이죠.
이 도구는 글자 단위로 읽어서 어느 영역의 한자든 정확히 한 글자로 셉니다.

200자 원고지 장수

한글 프로그램과 같게 맞췄습니다

원고지 장수는 흔히 “공백 포함 글자 수 ÷ 200"으로 어림합니다.
하지만 실제 원고지는 문단이 바뀌면 줄을 새로 시작하니까, 짧은 문단이 많은 글일수록 어림값보다 장수가 많아집니다.
대사가 많은 소설이나 시에서는 차이가 꽤 크죠.

그래서 많이 쓰는 기준인 한글 프로그램의 문서 통계(파일 → 문서 정보 → 문서 통계)와 같은 숫자가 나오게 맞췄습니다.
다만 한컴 도움말에는 “200자 원고지에 옮겨 쓴다고 가정해 계산한다"는 설명만 있고 계산식은 없습니다.
그래서 규칙을 하나씩 가르는 시험 파일 40개를 한글 프로그램으로 열어 장수를 재고, 그 숫자가 모두 맞을 때까지 규칙을 맞췄습니다.

계산 규칙

규칙예
20칸 × 10줄이 한 장
문단마다 새 줄에서 시작하고, 줄 끝의 남은 칸은 버립니다한 글자짜리 문단 30개 → 30줄 → 3장
문단 첫 칸을 들여 쓰지 않습니다가 200자 한 문단 → 10줄 → 1장
빈 문단도 한 줄입니다
빈칸, 탭, 한글, 한자, 영문 대문자, 대부분의 문장부호는 한 칸
영문 소문자, 숫자, 마침표, 하이픈은 이웃한 두 글자가 한 칸2026 → 2칸, 가a가 → 3칸
쉼표는 칸을 차지하지 않습니다
마침표가 줄 첫머리에 오면 앞 줄 끝에 붙입니다 (한 줄에 한 칸까지)물음표·따옴표·괄호·。 는 붙이지 않음
장수는 줄 수 ÷ 10을 반올림14줄 → 1장, 15줄 → 2장

장수를 반올림하는 점에 주의하세요.
4줄짜리 짧은 글은 0장으로 나옵니다.
한글 프로그램도 그렇게 보여 주기 때문에 그대로 따랐어요.
한 장이 안 되는 짧은 글은 글자 수로 분량을 보시는 편이 낫습니다.

공백 제외 원고지 장수

원고료나 분량을 공백을 빼고 따지는 곳이 있어서, 원고지 장수도 공백 제외 값을 함께 보여 드립니다.
문단마다 빈칸·탭을 모두 지운 뒤, 위와 같은 규칙으로 원고지에 옮겨 셉니다.
문단 구분은 그대로라서, 짧은 문단이 많은 글은 공백을 빼도 장수가 크게 줄지 않습니다.

한글 프로그램에는 없는 값이니, 한글 프로그램의 숫자와 맞춰 볼 때는 공백을 포함한 장수를 보세요.

언어별 글자 수와 다르게 세는 것

원고지 장수는 한글 프로그램을 따르다 보니, 위의 언어별 글자 수와 기준이 다른 곳이 있습니다.

  • 옛한글 첫가끝은 자모마다 한 칸입니다. ᄒᆞᆫ 은 글자 수로는 1, 원고지로는 3칸이에요. 방점도 한 칸입니다.
  • 한양 PUA와 구결만으로 된 문단은 빈 문단으로 칩니다. 다른 글자와 섞여 있으면 한 자가 한 칸입니다.
  • 확장 B 이후의 한자는 한 칸입니다. 이 점은 언어별 글자 수와 같습니다.

이 도구가 다루지 않는 것

한글 프로그램은 표·글상자 안의 글자와 그림을 원고지 계산에서 빼고, 머리말·꼬리말과 각주·미주는 넣습니다.
이 도구는 붙여넣은 텍스트만 세므로, 한글 문서에서 복사할 때 어떤 부분이 따라왔는지에 따라 숫자가 달라질 수 있습니다.

시험해 보지 못한 문장부호(느낌표, 쌍점, 낫표 등)와 탭은 한 칸으로 셉니다.
원고지 쓰는 법 자체도 출판사나 공모전마다 조금씩 다르니, 제출처에 기준이 따로 있다면 그쪽을 따르세요.

알아두기

처리 순서

옵션을 둘 다 켜면 이 순서로 처리합니다.

  1. 괄호 범위를 지웁니다.
  2. 시작 문자열로 행을 고릅니다.
  3. 고른 행으로 한자 수, 언어별 글자 수, 원고지 장수를 셉니다. 고른 행 하나가 원고지의 한 문단입니다.

괄호를 먼저 지우는 이유는 괄호가 여러 행에 걸칠 수 있기 때문입니다.
이때 괄호 안의 줄바꿈은 남겨 둡니다.
그래야 행 구성이 그대로 유지되어, 괄호 뒤에 이어지는 행이 앞 행에 붙어 버리지 않거든요.

((OR))學而{주석이
여러 줄에 걸침}時習之
((OR))不亦說乎

위 텍스트는 괄호를 지우면 ((OR))學而 / 時習之 / ((OR))不亦說乎 세 행이 됩니다.
時習之 는 ((OR)) 로 시작하지 않으므로 세지 않아요.

겹괄호와 짝이 맞지 않는 괄호

여는 괄호와 닫는 괄호가 다르면 겹괄호를 짝지어 처리합니다.
{가{나}다} 는 바깥 괄호 전체가 지워집니다.
여는 괄호와 닫는 괄호가 같으면(|...| 처럼) 나오는 순서대로 열고 닫습니다.

짝이 맞지 않으면 세지 않고 에러를 냅니다.

  • 닫히지 않은 괄호 — '{'가 닫히지 않음
  • 여는 괄호 없이 나온 닫는 괄호 — '}'에 짝이 되는 여는 괄호가 없음

닫는 괄호가 빠지면 그 뒤 문서 끝까지가 통째로 지워진 채 세어집니다.
숫자는 그럴듯하게 나오는데 실제로는 틀린 거죠.
조용히 틀린 값을 내주기보다 어디가 문제인지 알려 드리는 쪽을 택했습니다.

에러 창에서 바로 고치기

긴 원고에서 “3129행"이라는 말만으로는 그 자리를 찾아가기 어렵죠.
그래서 에러가 나면 짝이 맞지 않는 곳을 모두 모아 창으로 띄웁니다.

  • 행마다 문제의 괄호 앞뒤 글을 괄호를 강조해서 보여 주고, 그 아래에 행 전체를 고칠 수 있는 칸을 둡니다.
  • 칸에서 고친 내용은 입력창에도 바로 반영됩니다. 다 고친 뒤 [다시 세기] 를 누르면 됩니다.
  • 그래도 남은 곳이 있으면 창이 다시 뜹니다. 없으면 결과가 나옵니다.
  • 에러가 많으면 창 안의 목록만 스크롤되고, [닫기]와 [다시 세기]는 늘 아래에 보입니다.
  • 한 번에 200곳까지 보여 줍니다. 그보다 많으면 고친 뒤 다시 셀 때 나머지가 나옵니다.

다른 행을 고쳐야 할 때

닫히지 않은 괄호는 실제 실수가 그 자리에 있지 않을 수 있습니다.
그 뒤 어딘가에서 닫는 괄호를 빠뜨렸거나 다른 글자로 잘못 쳤을 수도 있거든요.
괄호는 여러 행에 걸칠 수 있어서, 짝이 끊긴 곳이 다음 행일 때도 있고요.

창에서는 에러가 난 행만 고칠 수 있으니, 이럴 때는 창에 나온 앞뒤 글을 보고 위치를 확인한 뒤 창을 닫고 입력창에서 고치세요.

한자 정규화도 함께 적용됩니다

세기 전에 본문과 옵션 문자열 모두에 한자 정규화를 적용합니다.
모양은 같고 코드만 다른 호환용 한자를 표준 코드로 맞추는 작업이에요.
한 글자가 한 글자로 바뀌므로 글자 수에는 영향이 없습니다.
다만 시작 문자열이나 괄호에 한자를 썼을 때, 본문과 코드가 달라 맞지 않는 일을 막아 줍니다.

정규화 데이터를 받아 오는 동안에는 [세기] 버튼이 잠시 꺼져 있습니다.

파일과 처리 속도

파일 업로드 버튼으로 텍스트 파일을 불러올 수 있습니다.
지원 형식: .txt, .md, .html, .xml, .tsv, .csv

모든 처리는 브라우저 안에서 끝나고, 텍스트는 어디로도 전송되지 않습니다.
170만 자 남짓한 텍스트를 1초 안에 셉니다.

계산은 화면과 따로 도는 작업 공간(Web Worker)에서 합니다.
정규식에 따라서는 계산이 끝없이 길어질 수 있거든요. ^(a+)+$ 같은 식이 대표적입니다.
그래서 10초 안에 끝나지 않으면 계산을 멈추고 알려 드립니다.
그동안 화면은 멈추지 않고, 계산이 잠깐 이상 걸리면 “세는 중…” 표시가 뜹니다.

함께 쓰면 좋은 도구

  • 깨진 한글 복구 — 한양 PUA 옛한글과 첫가끝을 서로 바꾸고, 자소가 분리된 한글을 되살립니다.
  • 한자 정규화 — 다중코드 한자를 표준 한자로 통일해 문서 자체를 정리합니다.
  • 색인어 추출기 — 정해진 기호로 묶인 색인어를 뽑아 중복 없이 정렬합니다.
  • 태그 변환기 — 고전 텍스트의 태그를 색과 크기로 보여 줘 검수를 돕습니다.

바로 사용하기 — 글자 수 세기