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?
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.
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.
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 |
O controle NUL (Null) é ilegal e não pode ser representado em NCR ou codificado diretamente na linguagem de marcação.
HTML, XHTML e XML 1.0 não suportam a série C0 exceto para HT (Tabulação Horizontal ) U+0009, LF (Line Feed) U+000A, e CR (Carriage Return) U+000D. A série C1 é suportada, isto é, você pode codificar os controles diretamente ou representá-los em NCRs (Numeric Character References).
XML 1.1 restringe a série C1, exceto para NEL U+0085 (a EBCDIC New line), bem como a série C0. Contudo, XML 1.1 permite representação de controles em NCRs (Numeric Character References).
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.
Mais detalhes sobre a série C0 estão disponíveis em Unicode Code Chart: C0 Controls and Basic Latin
Mais detalhes sobre a série C1 estão disponíveis em Unicode Code Chart: C1 Controls and Latin-1 Supplement
O documento Unicode in XML and other Markup Languages contém diretrizes sobre o uso de Normas Unicode em conjunto com linguagem de marcação tal como a XML.