개발/JAVA
trim()으로 걸러내지 못하는 공백문자 정규식으로 걸러내기
신매력
2016. 7. 22. 17:16
우리 서비스에서 공백이름으로는 저장할 수 없도록 trim()으로 막는 곳이 있는데
클라이언트는 물론 서버에서도 걸러지지 못하고 넘어가서 DB까지 저장되어버린 공백문자를 발견했다.
그 공백 문자는 바로 유니코드(U+00A0) No-Break space였다.
HTML에서 공백쓸 때 쓰던 가 이 공백문자였던거구만.. ㅋㅋ
java에서 그 문자가 정말 trim으로 걸러지지 않는지 테스트를 해보자.
먼저 유니코드(U+00A0)을 UTF-8로 하면 무엇인지 본다. (http://www.utf8-chartable.de/)
c2 a0이다.
String utf8char = "c2 a0"; // no-break space
String[] strNumbers = utf8char.split(" ");
byte[] rawChars = new byte[strNumbers.length];
int index = 0;
for (String strNumber : strNumbers) {
rawChars[index++] = (byte) (int) Integer.valueOf(strNumber, 16);
}
String nbsp = new String(rawChars, Charset.forName("UTF-8")); // 문제의 그 공백문자
System.out.println(nbsp.trim().length());
trim()을 했으면 length가 0이어야 정상이지만,
1이 나온다.
역시나 걸러내주지 못했다는 뜻이다.ㅠㅠ
이것은 결국 정규식으로 걸러내도록 수정했다.
nbsp = nbsp.replaceAll("[\\s\\u00A0]+$", "");
맨 뒤에 있는 모든 공백문자를 제거해주는 정규식
\s => trim()이 걸러내주는 일반 공백문자들
\u00A0 => no-break space