~ / posts / text
📝 문서·텍스트

PDF·카톡 복사 텍스트 줄바꿈 공백 정리법, NBSP·전각 공백까지 한 번에

PDF 논문 한 단락을 복사해 번역기에 넣었더니 문장이 줄마다 끊겨서 엉뚱하게 번역된 적, 엑셀에서 분명 같은 이름인데 VLOOKUP이 못 찾은 적, 다들 한 번쯤 있을 거예요. 원인은 대부분 두 가지입니다. PDF와 메신저는 화면의 줄 끝마다 실제 줄바꿈을 넣어 복사하고, 웹·한글 문서·메신저는 일반 스페이스처럼 보이는 다른 공백 문자(NBSP, 전각 공백, 제로폭 공백)를 섞어 보냅니다. 그래서 정리는 "문단은 살리고 줄바꿈만 공백으로", 그다음 "특수 공백을 일반 공백으로" 순서로 하면 거의 해결돼요.

이 글에서는 어디서 복사했느냐에 따라 어떤 문제가 생기는지, 눈에 안 보이는 문자를 어떻게 찾는지, 그리고 도구·엑셀·워드·정규식으로 각각 어떻게 지우는지를 정리했어요. 예시는 이 사이트의 줄바꿈 제거기와 공백 제거기가 실제로 쓰는 규칙에 맞췄습니다.

핵심 요약

PDF는 문단 구조 없이 줄 위치만 저장해서, 복사하면 화면의 줄 끝마다 줄바꿈이 들어가요.

빈 줄을 문단 경계로 남기고 나머지 줄바꿈을 공백으로 바꾸면 번역기·문서에 바로 쓸 수 있어요.

엑셀 TRIM은 일반 스페이스만 지우고 NBSP(U+00A0)와 전각 공백(U+3000)은 못 지웁니다.

제로폭 공백(U+200B)은 정규식 \s에도 안 걸리니 따로 지정해서 지워야 해요.

복사한 텍스트가 깨지는 이유, 출처별로 다르다

같은 "지저분한 텍스트"라도 어디서 왔느냐에 따라 문제의 종류가 달라요. 출처를 알면 어떤 정리를 해야 할지 바로 정해집니다.

출처주로 생기는 문제먼저 할 정리
PDF (논문·보고서·전자책)줄 끝마다 줄바꿈, 영어 하이픈 줄 나눔, 쪽 번호·머리글 끼어듦줄바꿈 → 공백, 문단 유지
한글 PDF글자 사이에 공백이 끼거나 공백이 사라짐줄바꿈 정리 후 연속 공백 1칸
웹페이지NBSP( ), 제로폭 공백, 연속 공백특수 공백 → 일반 공백
카카오톡·슬랙메시지마다 줄바꿈, 이름·시간 줄 섞임이름·시간 제거, 줄 잇기
한글(HWP)·일본어 문서전각 공백(U+3000) 들여쓰기전각 공백 → 일반 공백
엑셀·구글 시트셀 끝 공백, 셀 안 줄바꿈, 탭앞뒤 공백 제거
오래된 이메일70~80자마다 강제 줄바꿈, 인용 기호 >줄바꿈 → 공백, 문단 유지

PDF에서 복사하면 왜 줄이 끊길까

PDF는 "문단"이라는 개념 없이 페이지 위 정해진 좌표에 글자를 배치하는 형식이에요. 화면에서 한 줄이 끝나는 자리는 실제 문장 끝과 상관없이 그냥 폭이 다 찬 자리일 뿐인데, 복사할 때는 그 자리마다 줄바꿈 문자가 들어간 것처럼 나옵니다. 번역기(파파고, 구글 번역, DeepL)는 줄바꿈을 문장 끝으로 이해하기 때문에, 한 문장을 서너 조각으로 나눠 번역하면서 품질이 크게 떨어져요.

영어 PDF에는 하이픈 줄 나눔(infor-⏎mation)이 섞이고, 조판이 잘 된 문서에서는 "fi", "fl" 같은 글자 쌍이 합자(fi, U+FB01) 한 글자로 복사되기도 해요. 합자가 섞이면 검색에서 "file"이 안 걸리니 이런 문서는 결과물을 한 번 검색해 보는 게 좋습니다. 두 단 편집 논문은 왼쪽 단과 오른쪽 단의 줄이 번갈아 섞여 복사되는 경우도 있는데, 이건 도구로 자동 복구가 어렵고 단별로 따로 드래그해서 복사하는 게 가장 빠릅니다.

줄바꿈 정리: 문단은 살리고 줄만 잇는 법

예시로 PDF에서 복사한 두 문단짜리 글을 보죠.

연구 결과에 따르면 하루 30분 이상 걷는 사람은
그렇지 않은 사람보다 수면의 질이 높게
나타났다. 특히 오후 시간대의 산책이
효과적이었다.

이러한 경향은 연령과 관계없이 일관되게
관찰되었으며, 추가 연구가 필요하다.

7줄(빈 줄 포함)인데 실제로는 문단 2개예요. 줄바꿈 제거기에서 "공백으로 바꾸기 + 문단(빈 줄) 유지"를 고르면 줄바꿈 4개가 공백으로 바뀌고, 빈 줄로 구분된 문단 경계는 그대로 남아서 결과가 3줄(문단 2개와 사이의 빈 줄)이 됩니다. 글자 수는 122자로 똑같아요. 줄바꿈 하나가 공백 하나로 바뀌었으니까요.

여기서 고를 수 있는 방식이 세 가지인데, 언제 무엇을 쓰는지가 중요해요.

문단 구분이 사라졌다면

원문 PDF에서 문단 사이에 빈 줄이 없으면, 복사한 텍스트에는 문단을 구분할 정보 자체가 없어요. 이 경우 결과가 통째로 한 덩어리가 됩니다. 두 가지 방법이 있어요. 원문에서 문단이 시작되는 자리에 빈 줄을 직접 넣고 변환하거나, 결과에서 필요한 위치에 엔터를 넣는 거죠. 문단이 짧으면 후자가 빠르고, 긴 보고서라면 전자가 덜 헷갈립니다.

목록이 섞인 글이라면 "목록(-, •, 1.) 줄 유지"를 켜 두세요. 줄 앞에 하이픈, 글머리 기호, "1." 같은 번호가 있으면 그 앞의 줄바꿈은 남겨서 목록 모양이 유지돼요. 영어 PDF는 "줄 끝 하이픈 단어 붙이기"를 켜면 infor-⏎mation이 information으로 붙습니다. 이 옵션은 다음 줄이 소문자로 시작할 때만 작동해서, well-⏎Known처럼 대문자로 이어지는 경우는 하이픈을 남겨요.

복사한 텍스트를 정리하는 순서: 출처 확인, 줄바꿈을 공백으로 바꾸고 문단 유지, 특수 공백을 일반 공백으로 바꾸기, 연속 공백 1칸, 최종 확인
줄바꿈을 먼저, 공백을 나중에 정리해야 두 번 일하지 않아요

카톡·메신저에서 복사한 글 정리

메신저 텍스트는 PDF와 반대로, 줄바꿈 하나하나가 대개 "의미 있는" 줄바꿈이에요. 한 사람이 메시지를 여러 번 나눠 보냈거나, 목록을 한 줄씩 보냈기 때문이죠. 그래서 무조건 이어 붙이기보다 어떤 모양으로 만들지를 먼저 정해야 합니다.

찾기:   ^\[[^\]]+\] \[[^\]]+\] 
바꾸기: (빈칸)

정규식 테스트 도구의 치환 기능에 이 패턴을 넣으면(여러 줄 모드 m 플래그) 각 줄 앞의 이름·시간이 지워지고 메시지 본문만 남아요. 그다음 줄바꿈 제거기로 넘기면 됩니다. 정규식이 처음이면 정규식 기초 문법 치트시트를 먼저 보세요.

눈에 안 보이는 공백 문자: NBSP·전각 공백·제로폭 공백

이게 진짜 골치 아픈 부분이에요. 화면에는 똑같이 빈칸으로 보이는데 컴퓨터는 서로 다른 문자로 취급하거든요. 그래서 "홍길동"과 "홍길동 "(끝에 NBSP)이 다른 값이 되고, 검색·VLOOKUP·중복 제거가 조용히 실패합니다.

문자코드주로 오는 곳화면
일반 스페이스U+0020키보드빈칸
탭U+0009엑셀·표 복사넓은 빈칸
NBSP (줄바꿈 없는 공백)U+00A0웹페이지  , 워드빈칸
전각 공백U+3000한글(HWP) 들여쓰기, 일본어 입력한 글자 폭 빈칸
얇은 공백 등U+2000~U+200A조판된 PDF·전자책좁은 빈칸
제로폭 공백U+200B웹 에디터, 일부 메신저안 보임
BOMU+FEFF파일 맨 앞, 윈도우 메모장안 보임
공백처럼 보이는 문자들의 UTF-8 바이트 수
일반 스페이스 U+0020일반 스페이스 U+0020 · 1바이트1바이트탭 U+0009탭 U+0009 · 1바이트1바이트NBSP U+00A0NBSP U+00A0 · 2바이트2바이트얇은 공백 U+2009얇은 공백 U+2009 · 3바이트3바이트전각 공백 U+3000전각 공백 U+3000 · 3바이트3바이트제로폭 공백 U+200B제로폭 공백 U+200B · 3바이트3바이트BOM U+FEFFBOM U+FEFF · 3바이트3바이트

글자 수는 같아도 바이트 수가 다르면 보이지 않는 문자가 섞였다는 신호예요

단위: 바이트 · 자료: 파이썬 str.encode('utf-8')로 각 문자를 직접 인코딩해 측정
표로 보기
구분UTF-8 바이트
일반 스페이스 U+00201
탭 U+00091
NBSP U+00A02
얇은 공백 U+20093
전각 공백 U+30003
제로폭 공백 U+200B3
BOM U+FEFF3

섞였는지 확인하는 방법

가장 쉬운 방법은 공백 제거기에 붙여 넣는 거예요. 입력란 아래에 일반 공백, 탭, 전각, NBSP, 제로폭, 줄바꿈이 각각 몇 개 들어 있는지 표시됩니다. NBSP가 0이 아니면 웹이나 워드에서 온 글이고, 전각이 있으면 한글 문서나 일본어 입력에서 온 글이에요.

글자 수와 바이트를 비교하는 방법도 있어요. 영문·숫자만 있는 셀인데 글자 수 세기에서 UTF-8 바이트가 글자 수보다 크다면 비ASCII 문자가 숨어 있다는 뜻이에요. 코드로 확인하려면 각 문자의 코드 포인트를 찍어 보면 됩니다. 이 방법은 JSON 파싱 에러 원인 정리에서 보이지 않는 문자를 찾을 때 쓴 것과 같아요.

엑셀·구글 시트에서 공백과 줄바꿈 지우기

엑셀 TRIM 함수가 공백을 못 지운다는 질문이 정말 많아요. 이유는 간단해요. 엑셀 TRIM은 일반 스페이스(U+0020)만 처리합니다. 앞뒤 공백을 지우고 단어 사이 연속 공백을 1칸으로 줄이지만, NBSP(CHAR(160))와 전각 공백은 손대지 않아요. CLEAN 함수도 코드 0~31의 제어 문자(셀 안 줄바꿈 CHAR(10) 포함)만 지웁니다.

하고 싶은 것엑셀 수식
일반 공백 앞뒤 정리=TRIM(A2)
NBSP까지 정리=TRIM(SUBSTITUTE(A2,CHAR(160)," "))
전각 공백까지 정리=TRIM(SUBSTITUTE(SUBSTITUTE(A2,CHAR(160)," "),UNICHAR(12288)," "))
셀 안 줄바꿈을 공백으로=SUBSTITUTE(A2,CHAR(10)," ")
모든 일반 공백 제거=SUBSTITUTE(A2," ","")

수식이 길어지면 실수하기 쉬워서, 저는 열을 통째로 복사해 공백 제거기에 붙이고 "앞뒤 공백만 제거" + NBSP·전각 옵션을 켠 뒤 결과를 다시 붙여 넣는 쪽을 더 자주 써요. 한 줄이 한 셀이라 순서가 그대로 유지됩니다. 정리 후 같은 값이 여러 번 나온다면 목록 중복 제거와 정렬 방법으로 이어서 정리하면 돼요.

워드·한글에서 찾아 바꾸기로 정리하기

MS Word의 찾기 및 바꾸기는 특수 문자 코드를 지원해요. ^p는 문단 기호(엔터), ^l은 줄 바꿈(Shift+Enter), ^s는 줄바꿈 없는 공백(NBSP), ^w는 모든 공백을 뜻합니다. PDF에서 복사한 글을 문단만 남기고 정리하는 고전적인 순서는 이렇습니다.

  1. ^p^p(빈 줄)를 문서에 없는 임시 기호, 예를 들어 ###으로 바꿉니다. 문단 경계를 보호하는 단계예요.
  2. ^p(남은 줄바꿈)를 공백 한 칸으로 바꿉니다.
  3. ###을 다시 ^p로 바꿉니다.
  4. ^s를 일반 공백으로, 공백 두 칸을 한 칸으로 몇 번 반복해 바꿉니다.

줄바꿈 제거기의 "문단(빈 줄) 유지"가 하는 일이 정확히 1~3단계예요. 한글(HWP)도 찾아 바꾸기에서 조판 부호를 고를 수 있지만 버전마다 메뉴가 달라서, 웹 도구로 정리한 뒤 붙여 넣는 쪽이 보통 더 빠릅니다.

정규식으로 한 번에 처리할 때 주의할 점

개발자라면 정규식 한 줄로 끝내고 싶을 거예요. 이때 \s가 무엇을 포함하는지 언어마다 다르다는 점을 알아야 합니다. Node.js와 파이썬에서 직접 확인한 결과예요.

문자JavaScript \sPython re \s
NBSP U+00A0포함포함
전각 공백 U+3000포함포함
얇은 공백 U+2009포함포함
BOM U+FEFF포함미포함
제로폭 공백 U+200B미포함미포함

제로폭 공백은 이름과 달리 유니코드에서 공백(whitespace)으로 분류되지 않아서 \s로 안 잡혀요. 그래서 안전한 정리 순서는 "제로폭 문자 삭제 → \s+를 공백 1칸으로 → 앞뒤 trim"입니다.

const clean = text
  .replace(/[​-‍⁠]/g, '')   // 제로폭 문자 삭제
  .replace(/[^\S\n]+/g, ' ')                       // 줄바꿈 빼고 모든 공백 → 1칸
  .replace(/ *\n */g, '\n')                        // 줄 앞뒤 공백 제거
  .trim();

두 번째 줄의 [^\S\n] 은 "줄바꿈이 아닌 공백"이라는 뜻이에요. 그냥 \s+ 를 쓰면 줄바꿈까지 공백으로 바뀌어 문단이 다 사라지니 주의하세요.

자주 묻는 질문

PDF에서 복사한 글을 번역기에 넣으면 왜 이상해지나요?

PDF는 화면의 줄 끝마다 줄바꿈이 들어간 채로 복사되고, 번역기는 줄바꿈을 문장 끝으로 이해해서 한 문장을 쪼개 번역하기 때문이에요. 줄바꿈을 공백으로 바꾸고 빈 줄로 된 문단만 남긴 뒤 넣으면 훨씬 자연스러워집니다.

엑셀 TRIM을 썼는데 공백이 안 지워져요.

TRIM은 일반 스페이스만 지우고 NBSP(CHAR(160))나 전각 공백은 처리하지 않아요. =TRIM(SUBSTITUTE(A2,CHAR(160)," "))처럼 먼저 바꾼 뒤 TRIM을 쓰거나, 공백 제거기에서 NBSP·전각 옵션을 켜고 정리하세요.

공백을 다 지웠는데도 글자 사이가 떨어져 보여요.

NBSP, 전각 공백, 얇은 공백 같은 특수 공백이 남아 있을 가능성이 커요. 공백 제거기 입력란 아래의 문자 종류별 개수를 보고 해당 옵션을 켜세요. 그래도 남는다면 공백이 아니라 폭이 넓은 문장부호일 수 있어요.

줄바꿈을 아예 없애면 안 되나요?

한국어 문장에서 줄바꿈을 완전히 없애면 줄 끝 단어와 다음 줄 첫 단어가 붙어 버려요. 문장은 "공백으로 바꾸기"를 쓰고, "완전히 제거"는 끊긴 전화번호·URL·코드처럼 붙여야 하는 값에만 쓰세요.

카톡 대화에서 이름과 시간만 지울 수 있나요?

줄 앞에 [이름] [시간] 형식으로 붙어 있다면 정규식 ^\[[^\]]+\] \[[^\]]+\] 를 빈칸으로 치환하면 됩니다. 형식이 다르면 실제 복사된 첫 줄을 보고 패턴을 맞춰야 해요.

정리

복사한 텍스트 정리는 순서가 전부예요. 출처를 보고 문제를 짐작하고, 줄바꿈을 공백으로 바꾸면서 문단을 지키고, 마지막에 NBSP·전각·제로폭 같은 특수 공백을 일반 공백으로 바꿔 연속 공백을 1칸으로 줄이면 됩니다. 엑셀 TRIM이 안 먹히거나 같은 값이 다르게 인식될 때는 거의 항상 보이지 않는 공백이 범인이에요.

PDF·메일 줄바꿈은 줄바꿈 제거기, 특수 공백 확인과 정리는 공백 제거기에서 바로 해 보세요. 정리한 글의 분량을 확인하려면 글자 수·단어 수·어절 차이 글도 참고하세요.

#PDF 복사 줄바꿈#줄바꿈 제거#공백 제거#NBSP#전각 공백#엑셀 TRIM 안됨#카톡 복사 정리#워드 찾아바꾸기
← 이전 글camelCase snake_case kebab-case 차이, 언어·DB·URL별 네이밍 컨벤션 정리다음 글 →목록 중복 제거와 정렬, 엑셀·구글시트 방법과 대소문자·공백 함정 비교