Devhyun

메뉴

현재 화면 위치

데브현 메인 블로그 포스트

타이틀

폭없는 공백 (ZWSP: zero width space)

2020.02.13

Docx파일의 텍스트를 추출하여 DB에 저장하는 로직을 개발하고 있었습니다.
JAVA의 POI라이브러리를 활용해 Docx파일을 파싱하였고 정규표현식을 활용하여 텍스트를 편집하여 원하는 형태로 치환하는 작업을 진행했습니다.

그런데 LocalDate타입으로 변환하는 과정에서 파싱 에러가 발생했어요.. 😂
단순한 포멧 문제라 판단하면서 디버깅으로 값을 확인했습니다.

이건 뭐지?

문제의 코드

String item = items.get(title);
candidate.birth(LocalDate.parse(item, DateTimeFormatter.ofPattern("yyyy.MM.dd")));

image.png

JAVA의 String 클래스는 Char 배열로 이루어져 있습니다.
위의 사진에서 보시면 표기되는 값은 1983.11.17인데 실제 배열에 담겨있는 값이 이상합니다.

문제 해결

먼저 공백 문자라는 생각에 trim 처리, replace 처리 등 다양한 방법을 시도했지만,
해결되지 않았습니다.

그래서 해당 문자의 유니코드를 확인해 보기로 했습니다.

image.png

U+200B라는 코드네요..
구글에 검색해봅시다 !

image.png

폭 없는 공백이라는 문자인데요.
위키백과 설명을 가져와봤습니다 🎯

폭 없는 공백(ZWSP: zero width space)는 컴퓨터의 조판에 사용되는 비표시 문자로 문자 처리 시스템에 대해서 단어의 단락을 나타내는데 사용된다. 보통, 영어 등의 띄어쓰기를 하는 언어에서 문장의 도중에 개행을 넣을 경우에는 공백 기호의 위치에서 행해진다. 하지만, 빗금 등의 기호 뒤 등 공백은 넣지 않지만 개행을 해도 좋은 곳이나 일본어 등의 띄어쓰기를 하지 않는 언어에서 개행할 수 있는 위치를 명시하기 위해서 폭 없는 공백이 사용된다.

라이브러리가 파싱해준 결과물이니 파싱과정에서 언어 셋의 문제일 수도 있겠지만, 개행문자를 처리해주는 알고리즘 과정에서 문제가 생겼을 수도 있겠네요.
간단하게 파싱된 결과에서 폭 없는 공백 문자를 치환해주는 로직을 추가하였습니다.

String text = text.replaceAll("\\u200B", ""); // 폭없는 공백

마치며

처음 본 상황에 많이 당황했지만, 차근차근 원인에 대해 분석해보고 파악하여 해결하니 뿌듯하네요 🚀
여러분들도 폭 없는 공백(\u200B) 조심해주세요!

0개의 댓글

로그인을 하시면 댓글을 작성할 수 있어요 !
목록으로 가기