HTML, XHTML, XML e os códigos de controle

Intended audience: HTML coders (using editors or scripting), script developers (PHP, JSP, etc.)

Question

Como devo manipular os códigos de controle (isto é, as séries 'C0' U+0000-U+001F e 'C1' U+007F-U+009F) em XML, XHTML e HTML?

Background

Aplicações mais antigas, as vezes insere códigos de controle ao criar dados. Isto pode vir a ter importância para o entendimento de como estes códigos de controle são suportados por diferentes linguagens de marcação, quando da migração daquelas aplicações ou seus dados para o ambiente da Web.

Existem duas coleções de conjuntos de caracteres Unicode para códigos de controle. O Unicode Standard não faz qualquer uso particularizado destes controles, deixando sua definição a cargo da aplicação. Se a aplicação não especifica seu uso então eles serão interpretados de acordo com semântica da norma ISO/IEC 6429. A maioria de vocês deve estar familiarizado com os caracteres de controle 6429: ACK, NAK, BEL, LF, FF, VT, CR, e outros. A família das ISO 8859 e outrras normas de cacteres tomam como base para códigos de controle a norma ISO 6429.

Os códigos de controle da série U+0000-U+001F são conhecidos como série "C0". Esta série começa com o controle NUL (Null) U+0000. Os códigos de controle da série U+0080-U+009F são conhecidos como série "C1". O controle DEL (Delete) U+007F é adjacente ao início da série C1.

Answer

Manipulando códigos de controles

Códigos de controles devem ser substituidos por marcação apropriada. Uma vez que XML fornece uma maneira standard de codificar dados estruturados, representar código de controles por outras vias que não a marcação, acaba por comprometer as vantagens do uso de XML. O uso de código de controles em HTML e XHTML não é apropriado, uma vez que estas marcações destinam-se a representar textos e não dados.A única ocasião em que isto pode ser necessário é quando ultrapassados conteúdos de dados as contém e não é possível modernizá-los.

Se o dado não for textual mas binário, então será mais prático codificá-lo, usando por exemplo base 64 ou valor hexadecimal, para nos assegurarmos que somente caracteres suportados (válidos) são usados na linguagem de marcação. (E, com certeza decodificando texto quando processando os arquivos). Notar que XML Schema fornece tipos de dados para estas codificações.

Outra solução é a de armazenar os dados em um arquivo externo e fazer referência a ele no documento XML.

Em XML 1.1 (que está ainda no estágio de Candidato a Recomendação), se você precisar representar um código de controle a mais simplista alternativa é usar a NCR (numeric character reference - referência númerica de caracter). Por exemplo, o código de controle ESC (Escape) U+001B poderá ser representado tanto por  (hexadecimal) como por  (decimal) Numeric Character References.

Suporte para códigos de controle

A tabela a seguir fornece um sumário de suporte de código de controle pelas linguagens de marcação.

Controles Série HTML 4 XHTML 1.0 XML 1.0 XML 1.1
C0, except HT, LF, CR U+0000 (NUL) Ilegal Ilegal Ilegal Ilegal
U+0001-U+001F Ilegal Ilegal Ilegal NCR
HT, LF, CR U+0009, U+000A, U+000D Suportado Suportado Suportado Suportado
DEL + C1 U+007F-U+009F Ilegal Ilegal Suportado NCR
NEL U+0085 Ilegal Ilegal (permitido) Suportado

By the way

Já que a família ISO 8859 reserva a série C1 para controles, o conjunto de caracteres da Microsoft (p. ex.: 1250-1258) coloca caracteres nesta série. Algumas vezes, os autores de conteúdo usam equivocadamente caracteres Microsoft criando NCRs no lugar de usar valores Unicode. Devido o largo uso deste erro, muitos navegadores renderizam os caracteres da Microsoft nesta série. Este é um comportamento incorreto que acaba por não motivar os desenvolvedores a corrigir o erro. O problema eventualmente acaba por ser descoberto somente quando uma aplicação trata os dados como caracteres e não como um caracter errado, erroneamente interpretado ou quando um navegador em conformidade com as web standards falha ao renderizar o caracter.