개발자의 정신을 붕괴시키는 저주의 유니코드 65279
DB SQL 짜시는 분들도 언젠가 한번쯤
html 작업하시는 분들
자바로 파일 관련 코드 짜는데, 그 코드가 다른 프로그램에서도 수정되는 녀석인 경우
이 저주의 유니코드 65279 라는 녀석을 한번쯤은 접해 보시게 될 수 있습니다.
잘못 걸리면 이 녀석 때문에 몇 주, 몇 달의 시간을 허공에 날려보낼 수 있습니다.
먼저 스택 오버플로우 하나 보고 가실게요
https://stackoverflow.com/questions/9691771/why-is-65279-appearing-in-my-html
The character in question  is the Unicode Character 'ZERO WIDTH NO-BREAK SPACE' (U+FEFF). It may be that you copied it into your code via a copy/paste without realizing it. The fact that it's not visible makes it hard to tell if you're using an editor that displays actual unicode characters.
문제의  문자는 유니코드 문자 'ZERO WIDTH NO-BREAK SPACE'(U+FEFF)입니다. 복사/붙여넣기 과정에서 자신도 모르게 코드에 복사했을 수 있습니다. 보이지 않기 때문에 실제 유니코드 문자를 표시하는 편집기를 사용하고 있는지 확인하기 어렵습니다.
예. 이 문자는 눈에 보이지 않습니다.
문제는,
이 문자가 공백으로 취급되지 않는다는 겁니다.
이런 경우 특히 발생하기 쉬운데
텍스트 파일인데, Windows 에서, 일반적인 프로그램으로 작성된 파일 (인코딩은 UTF-8로 지정 분명히 해도 발생합니다.)
그 이유가, Windows 에서 이 문자를 BOM 으로 쓴다고 합니다.
Byte Order Mask. 유니코드 인코딩임을 표시하는 목적.
리눅스, 맥에서는 이 문자를 쓸 필요가 전혀 없죠.
얘도 엄연히 문자라서, 문자열 길이를 당당하게 차지하구요
눈에 보이지 않구요
근데 공백문자 취급은 아니라서, trim 메소드로 없어지지 않습니다.
엄연히 문자이기 때문에, 공백 여부 검사 (““.equals(~~)) 로도 판별이 되지 않습니다.
공백 아닌걸로 나옵니다.
자바 뿐만 아니라 Oracle Database, MS SQL Server 도 마찬가지였습니다.
특히 Orace Database 는 공백 텍스트를 NULL과 동일하게 보는데, 이 65279 녀석이 들어가면 NULL이 아닌 걸로 취급됩니다.
IS NULL 연산으로 걸러지지 않게 된다는 뜻입니다.
그리고 또 하나가
얘가 그 줄의 맨 앞에 들어가는 경우가 많아서
startsWith 메소드가 비정상 동작하게 만드는 요인이 됩니다.
“그럼 어떻게 해요?”
자바 코드에서는 이런 식으로 제거가 가능하다고 합니다.
public class RemoveBOM {
public static void main(String[] args) {
String originalString = "\uFEFFThis string has a BOM.";
System.out.println("Original String: \"" + originalString + "\"");
// Remove the BOM character
String cleanedString = originalString.replace("\uFEFF", "");
System.out.println("Cleaned String: \"" + cleanedString + "\"");
}
}DB의 경우는 다음 글을 참고
https://fubabaz.tistory.com/63
여기 보니까, 65279 말고도 빌어먹을 문자들이 여럿 더 존재하네요.
여하튼, 개발자에게 아무 짝에도 쓰잘데기 하나도 없는 이 저주의 문자
유니코드 65279
뭔가 의심이 드는 상황이 발생했다면, 이 녀석을 제거하는 코드를 넣고 다시 테스트를 해봅시다.