본문 바로가기

웹사이트

Zero Width Space 문자 (화면에 안보이는 문자)

* 본 글은 글 특성상 특이한 특수문자를 사용하여 일부 문장 등이 깨져보일 수 있습니다.



며칠 전에 개발 작업을 하다가 신기한 경험을 하였다. MySQL에 필드명을 영어로 검색해서 넣었는데 PHP에서 SELECT를 하니까 자꾸 SQL 오류가 발생했다. 없는 필드라고 한다. 아무리 다시 보고 다시 봐도 똑같아 보이던 와중에 결국 해당 단어들을 다시 입력해서 문제를 해결했고 며칠 뒤 지인에게서 Zero Width Space에 대해서 들었다.


다음 2줄을 살펴보면 최신 브라우저라면 같은 것으로 보일 것이다. 하지만 마우스로 클릭해보거나 크롬 개발자툴 등으로 살펴보면 단어 사이에 이상한 문자가 들어가 있다. 넓이가 0인 문자이다. (https://en.wikipedia.org/wiki/Zero-width_space)


이것은​한단어로​보입니다


이것은한단어로보입니다.


유니코드 U+200B 이며 HTML문자로는 ​ 으로 표현되는 이 문자는 화면상으로는 구분이 안된다.


예를 들어 보면


$a​bc = '123';

echo $abc;


위와 같은 소스가 겉으로 보기엔 당연히 123이 나와야 할 것이지만 실제로는

Notice: Undefined variable: abc in ... on line [n].. 이라는 에러가 발생한다

위에 $a​bc와 밑에 $abc는 다른 문자다


가장 큰 문제는 이 문자가 화면상으로 구분이 안되서 에디터에서 구분해 주는 기능이 없다면 조심하는 것 외에는 방법이 없어 보인다.


이로 인해 걱정되는 것은 게시판 같은 곳에서 제목을 바이트 수로 자를 경우 해당 문자도 Byte 상으로는 길이를 차지하기 때문에 비정상인 결과가 나올 수 있을 것 같다.


참고로 해당 문자열을 없애기 위해서는 Unicode 값과 HTML Entity 값은 다음과 같이 모두 삭제할 수 있다.


$text = preg_replace('/(\xE2\x80\x8B|​)/', '', $text);


만약 서버에서 해당 문자를 찾고 싶다면 해당 문자를 직접 복사 붙여넣기 하면 된다.


find ./ -name "*.php" -print | xargs grep "​" | more


* 주의 : xargs grep ""의 따음표 사이에 해당 문자가 존재 (실제로 커서로 한 글자씩 이동하면 해당 칸에서 한번 쉬었다가 간다. SHIFT 키 등을 이용해서 해당 문자를 복사할 수 있다)