PHP 소스코드 중 HTML 엔티티 디코딩하는 부분에서 가 들어오면 잘못된 코드로 처리하는 구문이 있어서 왜 그런건지 찾아보았다.
/* are we allowed to decode this entity in this document type? * HTML 5 is the only that has a character that cannot be used in * a numeric entity but is allowed literally (U+000D). The * unoptimized version would be ... || !numeric_entity_is_allowed(code) */ if (!unicode_cp_is_allowed(code, doctype) || (doctype == ENT_HTML_DOC_HTML5 && code == 0x0D)) goto invalid_code;
HTML5 스펙 문서를 보니 이 부분에 대한 규칙이 있었다.
16진수나 10진수로 된 HTML 엔티티는 0x0D Carriage return과 문자가 아닌 유니코드와 아스키 공백을 제외한 제어문자는 사용할 수 없다고 나와있다. 왜 캐리지 리턴을 사용하지 못하도록 규정했는지는 잘 모르겠다. 개행은 그냥 0x0A 하나로 하면 되고 캐리지 리턴의 본질적 의미가 타자기 시절의 그 행의 맨 앞으로 커서를 보내라는 뜻이라서 실질적인 공백도 아니고 오히려 표현하기가 복잡해지니 그런걸지도 모르겠다. 아무튼 표준 자체가 못쓴다고 그러니까 쓰지말자. 물론 써도 브라우저들이 알아서 적절하게 처리하기 때문에 아무 문제도 생기지 않는다.