blog.stackframe.dev

아무 유니코드나 HTML 엔티티로 표현가능하지 않음

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 하나로 하면 되고 캐리지 리턴의 본질적 의미가 타자기 시절의 그 행의 맨 앞으로 커서를 보내라는 뜻이라서 실질적인 공백도 아니고 오히려 표현하기가 복잡해지니 그런걸지도 모르겠다. 아무튼 표준 자체가 못쓴다고 그러니까 쓰지말자. 물론 써도 브라우저들이 알아서 적절하게 처리하기 때문에 아무 문제도 생기지 않는다.

댓글