이름 참조와 숫자 참조를 모두 풉니다
HTML 엔티티에는 두 가지 표기가 있습니다.
- 이름 참조 —
&,<, ,©등 2,000개가 넘습니다 - 숫자 참조 —
가(10진수),가(16진수)
둘 다 처리합니다. 목록을 직접 들고 있는 게 아니라 브라우저의 HTML 파서에 맡기기 때문에, 표준에 있는 엔티티라면 빠짐없이 풀립니다.
안전하게 푼다는 것
엔티티를 푸는 흔한 방법은 div.innerHTML = 값을 쓴 뒤 textContent를
읽는 것입니다. 그런데 값에 <img src=x onerror=…>가 섞여 있으면 그 순간
코드가 실행됩니다. 남의 로그를 붙여넣는 도구에서는 위험합니다.
이 도구는 DOMParser로 화면에 붙지 않는 별도 문서를 만들어 거기서 글자만
꺼냅니다. 스크립트도 이미지 요청도 실행되지 않습니다.
때문에 문자열 비교가 실패할 때
웹 페이지에서 복사한 텍스트에는 (U+00A0)가 자주 섞여 있습니다.
화면에서는 그냥 공백으로 보이는데, 코드에서 trim()이 안 먹고 비교가 실패합니다.
엑셀·워드에서 붙여넣은 데이터도 마찬가지입니다.
디코딩 후에도 이게 남아 있으면 결과창 아래에 몇 개인지 알려 줍니다. 줄바꿈 없는 공백을 보통 공백으로를 켜면 보통 공백으로 바꿔 줍니다.
&lt; 처럼 두 번 감싸진 값은요?
템플릿 엔진이 이스케이프한 값을 한 번 더 이스케이프하면 이렇게 됩니다. 이중
이스케이프 끝까지 풀기를 켜면 변화가 없을 때까지 반복합니다. 다만 본문에 진짜로
<라고 적혀 있던 경우까지 풀어 버리므로, 원인을 찾을 때만 켜세요.