CSV 도우미English

공백을 지웠는데 코드가 다르다면? 스페이스와 NBSP 확인하기

같아 보이는 A100 뒤에 일반 스페이스가 붙었을 수도, NBSP(줄바꿈하지 않는 공백)가 붙었을 수도 있습니다. 눈에 안 보인다는 이유로 같은 문자나 지워도 되는 문자로 판단하지 마세요. 먼저 원본을 보존하고 문자 위치와 종류를 확인합니다.

원인: 공백처럼 보이는 문자는 하나가 아닙니다

일반 스페이스는 U+0020, NBSP는 U+00A0입니다. Microsoft는 Excel TRIM이 ASCII 스페이스(32)를 대상으로 설계돼 NBSP(160)를 단독으로 제거하지 않는다고 설명합니다. 그러므로 ‘TRIM을 썼으니 모든 공백이 없어졌다’고 판단하면 안 됩니다. Microsoft TRIM 설명

또한 Excel 워크시트 TRIM과 VBA Trim, Python strip, 도구의 ‘공백 무시’는 이름만 보고 같은 동작이라고 가정하면 안 됩니다. 이 글의 Python 예제는 명시한 문자를 양끝에서만 제거하는 비교 사본이며, Excel TRIM을 구현한 코드가 아닙니다.

재현: 코드처럼 보이는 합성 값 4개

합성 공백 CSV는 실제 고객 자료가 아닙니다. 표의 설명 기호는 값을 보여 주기 위한 것으로 원문에 그대로 입력하지 않습니다.

순번원문을 설명한 모습코드포인트 차이
S01A100추가 문자 없음
S02A100 + 일반 스페이스끝 U+0020
S03A100 + NBSP끝 U+00A0
S04A + NBSP + 100문자열 내부 U+00A0

네 원문은 서로 다릅니다. S04의 내부 NBSP가 잘못 들어간 것인지, 의미 있는 구분자인지는 이 표만으로 판단하지 않습니다.

해결: 위치 확인 → 규칙 합의 → 사본 비교

먼저 제공처에 코드의 양끝 U+0020·U+00A0가 불필요한지 확인하세요. 아래에서는 두 종류의 양끝 문자만 불필요하다고 확인한 가정을 둡니다. 내부 문자는 보존합니다. 실제 자료 전체를 이 규칙으로 자동 정리하는 예가 아닙니다.

파일과 같은 폴더에서 다음 코드를 실행합니다. ascii는 보이지 않는 문자를 이스케이프해서 보여 줍니다. strip(chars)의 인수는 문자열에서 제거할 접미어가 아니라 양끝에서 제거할 문자 집합입니다. Python 문자열 공식 문서

import csv

with open('guide-15-space-nbsp.csv', encoding='utf-8-sig', newline='') as f:
    rows = list(csv.DictReader(f, strict=True))

raw = [row['code'] for row in rows]
space_only = [value.strip(' ') for value in raw]
edge_copy = [value.strip(' \u00a0') for value in raw]
for row, value, normalized in zip(rows, raw, edge_copy):
    points = ' '.join(f'U+{ord(char):04X}' for char in value)
    print(row['record_id'], ascii(value), points, '=>', ascii(normalized))
print('distinct_raw:', len(set(raw)))
print('distinct_U0020_edges:', len(set(space_only)))
print('distinct_two_edge_chars:', len(set(edge_copy)))
print('interior_preserved:', edge_copy[3] == raw[3])

기대 결과는 원문4종류 → 양끝 U+0020만 무시하면3종류 → 양끝 두 문자만 무시하면2종류입니다. S01~S03은 사본에서 A100으로 비교되지만 S04의 내부 NBSP는 남습니다. 마지막 출력은 interior_preserved: True입니다. 코드는 원본 파일에 덮어쓰거나 서로 같아진 행을 자동 삭제하지 않습니다.

모든 NBSP를 빈 문자열로 치환하면 S04도 A100이 됩니다. 양끝 정리와 내부 문자 삭제는 다른 변경입니다. 실제 업무에서 같은 코드인지 확인하지 않은 채 내부까지 지우면 서로 다른 키를 합칠 수 있습니다.

CSV 도우미에서는 두 기능을 구분하세요

CSV 검사기의 코드 열에 code를 선택하면 현재 구현은 양끝 U+0020 스페이스를 안내합니다. 이 예제에서는 S02 한 건이 그 경고 대상입니다. S03/S04의 NBSP를 이 코드 열 경고가 찾아 준다고 소개하지 않습니다. 경고가 없다는 사실은 모든 비표시 문자가 없다는 보장이 아닙니다. 이 경고는 원문을 자동 정리하지 않습니다.

반면 중복 비교 도구에서 code열을 비교하고 ‘앞뒤 공백 무시’를 켜면, 현재 라이브러리의 양끝 정리는 이 예제의 U+0020과 NBSP를 모두 제거한 비교 키를 만듭니다. 이때 첫 S01과 S04 두 행이 남고 S02·S03은 제외됩니다. 남은 S04의 내부 NBSP는 보존됩니다. 공백 무시를 끄면 네 행이 모두 남습니다.

두 기능의 대상 문자가 같다고 가정하지 마세요. 중복 비교 옵션도 남긴 값의 원문을 바꾸는 기능이 아닙니다. 예를 들어 S03만 있는 별도 비교에서 그 행이 남으면 끝 NBSP도 원문에 남습니다. 첫 행을 남긴다는 사실이 업무상 올바른 코드 선택을 뜻하지도 않습니다.

한계와 검토 정보

합성4건의 코드포인트·명시한 양끝 문자 제거·원문종류4/3/2·내부 NBSP 보존을 Python으로 확인했습니다. 현재 CSV 라이브러리의 코드 열 스페이스 경고1건, code열 중복 비교 시 공백 무시 전4행/후2행, 남긴 원문 보존도 로컬 대조했습니다. 실제 Excel TRIM·셀 자료형·브라우저 UI·다운로드는 실행하지 않았습니다. 라이브러리 검증이 Excel의 모든 공백 비교 규칙을 입증하는 것은 아닙니다.

탭·줄바꿈·전각공백·제로폭 문자·Unicode 정규화·대소문자 차이는 이번 예제 밖입니다. 자동 일괄 치환 전에 원본과 업무 규칙을 확인하세요.

검토일: 2026-10-19. 참고용 합성 예제이며 전문가 감수나 사람의 실제 Excel 검수는 받지 않았습니다.

AI 보조 작성: AI로 원고와 합성 자료를 작성하고 로컬 코드 출력을 대조했습니다. 실제 고객 자료를 사용하지 않았습니다.

이 글의 예제 파일을 CSV 검사기에 넣어 직접 확인해 보세요.

CSV 검사기 열기 ›