보이지 않는 문자는 반드시 빈 문자가 아닙니다. 단어 경계를 표시하고, 줄 바꿈을 막고, 글자 모양을 연결하고, 표시 방식을 선택하거나 텍스트 방향을 바꾸는 지시가 될 수 있습니다.
눈에는 같은 두 문자열이 서로 다른 명령을 담고 있을 수 있습니다.
‘공백’에는 서로 다른 역할이 있다
U+0020 SPACE는 키보드의 익숙한 공백입니다. 유니코드에는 다음 문자도 있습니다.
- U+00A0 NO-BREAK SPACE: 폭은 있지만 줄 바꿈을 막음
- U+2009 THIN SPACE: 더 좁은 조판 간격
- U+3000 IDEOGRAPHIC SPACE: 동아시아 전각 한 칸
- U+2800 BRAILLE PATTERN BLANK: 점이 없는 점자 문자이며 일반 공백이 아님
모두 빈칸처럼 보일 수 있지만 폭, 줄 바꿈, 의미와 접근성이 다릅니다. 플랫폼이 한 공백을 거부한다고 ‘빈 것처럼 보이는’ 다른 문자로 바꾸면 예상하지 못한 레이아웃이 생깁니다.
폭이 없어도 지시는 남는다
- U+200B ZERO WIDTH SPACE: 보이는 간격 없이 줄 바꿈 후보를 둠
- U+2060 WORD JOINER: 폭을 늘리지 않으면서 줄 바꿈을 막음
- U+200C ZERO WIDTH NON-JOINER: 필기 연결이나 합자를 막음
- U+200D ZERO WIDTH JOINER: 연결을 유도하고 이모지 시퀀스를 결합함
- U+FE0E/U+FE0F: 텍스트 또는 이모지 표시를 요청함
이들을 모두 ‘보이지 않는 공백’이라고 부르면 역할 차이를 놓칩니다. 일부는 공백조차 아닙니다. 문맥에 따라 모양이 달라지는 문자 체계에서는 결합자와 비결합자가 올바른 철자에 포함되므로 함부로 지울 수 없습니다.
방향 제어는 실제 다국어 문제를 해결한다
아랍어와 히브리어는 주로 오른쪽에서 왼쪽으로, 라틴 문자와 숫자는 왼쪽에서 오른쪽으로 흐릅니다. 유니코드 양방향 알고리즘이 혼합 텍스트의 표시를 결정하고 방향 표시, 격리, 임베딩과 덮어쓰기가 모호한 경우를 돕습니다.
다국어 텍스트에 꼭 필요한 기반이지만 저장 순서와 화면 순서가 다를 수 있습니다. 잘못 처리하면 화면이 프로그램이 읽는 시퀀스와 다른 뜻처럼 보입니다. 코드 편집기와 보안 도구가 예상 밖의 방향 제어를 경고하는 이유입니다.
복사한 텍스트가 디버깅하기 어려운 이유
보이지 않는 문자는 서식 문서나 웹페이지 복사, 입력기와 문자 조형, 자동 줄 바꿈, 이모지 시퀀스, 빈 닉네임 제작 과정에서 들어옵니다.
검색 실패, 같은 것처럼 보이는 중복 계정명, 일치하지 않는 URL, 예상 밖의 줄 바꿈과 멈춘 듯한 커서가 증상입니다. 올바른 진단은 Backspace를 반복하는 것이 아니라 코드 포인트를 보는 것입니다.
숨은 문자와 닮은꼴은 보안 문제이기도 하다
유니코드는 세계의 문자 체계를 지원하므로 서로 다른 문자가 비슷한 글리프를 가질 수 있습니다. 라틴 a와 키릴 а는 글꼴에서 거의 같아 보여도 다른 문자입니다.
Unicode Technical Standard #39는 혼동 가능한 식별자를 찾는 방법을 정의합니다. 목적은 모든 문자를 ASCII로 바꾸는 것이 아니라 맥락에 맞게 위험을 발견하는 것입니다. 국제 이름의 문자 혼합은 정당할 수 있지만 은행을 흉내 낸 도메인이라면 의심해야 합니다.
보이지 않는 삽입, 동형 문자 치환과 재배열이 눈에 띄는 변화 없이 검색과 언어 처리 결과를 바꾸는 공격도 연구되었습니다.
안전한 사용과 위험한 사용
텍스트 렌더링 시험, 문서 분석, 줄 바꿈 처리와 필요한 문자 체계의 결합 제어는 정당합니다. 링크나 계정 위장, 검토 우회, 소스 코드에 제어 문자 삽입, 금지된 빈 계정명 제작은 위험합니다.
제품은 예상하지 못한 서식 제어를 경고하고, 필요한 경우 정규화 결과와 혼동 가능한 형태를 비교하며, 정상적인 다국어 텍스트를 보존하고, 진단 도구에 코드 포인트를 표시해야 합니다.
정규화, 닮은꼴 탐지와 서식 제어 삭제는 서로 다른 문제를 풉니다. 모든 언어에 맞는 ‘유니코드 정리’ 버튼은 없습니다.
보이지 않는다고 의미가 없는 것은 아닙니다. 글리프가 없다는 사실 자체가 지시일 수 있습니다.
공백 특수문자 복사는 각 문자의 용도를 표시합니다. 시험과 정상적인 레이아웃에만 사용하고 위장이나 규칙 우회에는 쓰지 마세요.