우리 서비스에서 공백이름으로는 저장할 수 없도록 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
'개발 > JAVA' 카테고리의 다른 글
windows에서 JAVA 환경변수 설정하기 (11) | 2020.11.24 |
---|---|
Java String split 또는 replace 할 때 .(Dot, 점) 안되는 현상 (0) | 2016.09.29 |
Java의 Integer, int 숫자 비교의 주의사항 (3) | 2016.03.30 |
구아바(Guava)를 이용하여 List의 특정값 추출해서 새로운 List 만들기 (0) | 2016.03.25 |
구아바(Guava) Iterables.filter를 사용해서 리스트 필터링 하기 (0) | 2016.03.25 |