개발/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