# UTF-7

O UTF-7 (Formato de Transformação Unicode de 7 bits) é uma codificação de caracteres de tamanho variável capaz de representar um texto Unicode usando uma seqüência de caracteres ASCII. É usada principalmente em emails.
O principal padrão de transferência de email na Internet, o SMTP, define que somente caracteres ASCII devem ser usados, não permitindo que qualquer byte com valor superior aos definidos pelo padrão ASCII seja usado. MIME oferece uma maneira de especificar-se a codificação de caracteres utilizada permitindo o uso de outras opções como o UTF-8 ou UTF-16. Entretanto a infraestrutura de transmissão subjacente da internet ainda não é 8 bits compatível, consequentemente codificações de conteúdo para transferência devem ser utilizados. Dentre as opções de codificação de conteúdo para transferência, o base64 tem o problema de deixar ilegíveis mesmo os caracteres ASCII e o UTF-8 quoted-printable é bastante ineficiente utilizando entre 6 a 9 bytes para caracteres não-ASCII do Basic Multilingual Plane (BMP) e 12 bytes para os caracteres fora do BMP.
Se algumas regras forem seguidas durante a codificação, o UTF-7 pode ser enviado em um email sem utilizar-se uma seção MIME dedicada mas deve ser explicitamente identificada como a codificação de caracteres utilizada. Além disso, se for utilizado em cabeçalhos de email como "Subject:" o UTF-7 deverá estar contido em palavras codificadas MIME que identifiquem a codificação de caracteres utilizada. Como palavras codificadas exigem o uso de quoted-printable ou base64 o UTF-7 foi projetado para evitar o sinal = como caracteres especial, evitando assim o choque com o uso do = pelo quoted-printable.
O UTF-7 não é normalmente usado internamente em aplicações pois seu processamento é bastante desagradável. A criação do 8BITMIME reduziu a necessidade de codificar-se mensagens em formatos 7 bits compatíveis. Apesar de seu menor tamanho em relação ao uso combinado do UTF-8 com o quoted-printable ou base 64, o Consórcio sobre Correio da Internet (Internet Mail Consortium) recomenda que não se use o UTF-7.
Uma versão modificada do UTF-7 é usada pelo protocolo de recuperação de de mensagens IMAP para nomes de caixas postais. Veja a seção 5.1.3 do RFC 2060 para maiores detalhes.

## Descrição

O UTF-7 foi padronizado inicialmente pelo RFC 1642, Um formato de transformação do Unicode compatível com correio eletrônico. Este RFC foi sobrepujado pelo RFC 2152.
Alguns caracteres podem ser representados diretamente através de bytes ASCII únicos. O primeiro grupo é chamado de "caracteres diretos" e contém todos os 62 caracteres alfanuméricos e 9 símbolos: ' ( ) , - . / : ?. Os caracteres diretos são considerados bastante seguros para serem incluídos sem nenhum tratamento extra. O outro grupo principal são os caracteres diretos opcionais: contém todos os outros caracteres imprimíveis na faixa U+0020-U+007E exceto ~ \ e espaço. Usar os caracteres diretos opcionais reduz o tamanho da transmissão e aumenta a legibilidade mas também aumenta a possibilidade de que a tramsissão falhe por razões diversas como por exemplo servidores de email mal implementados.
Espaço, tabulação, carriage return e line feed também podem ser repesentados diretamente como caracteres únicos ASCII. Entretanto, se o texto codificado for usado em um email, é necessário cuidado para garantir que estes caracteres sejam usados de uma maneira que nenhuma codificação de conteúdo para transferência seja necessária.
Outros caracteres devem ser codificados em UTF-16 e posteriormente em base64 modificado. O início destes blocos são indicados por um +. O final é indicado por qualquer caractere não válido em base64 modificado. Caso especial: se o caractere após o base64 modificado for - (hífen-menos) ele é descartado. O caractere + é codificado como +-.

## Exemplos

* "Oi mundo!" é codificado como "Oi mundo!"
* "1 + 1 = 2" é codificado como "1 +- 1 = 2"
* "£1" é codificado como "+AKM-1". O código UTF-16 da libra esterlina é 0x00A3 que, convertido para base64 modificada resulta em:
** 000000$_2$ = 0$_{10}$ = 'A',
** 001010$_2$ = 10$_{10}$ = 'K', e
** 0011[00]$_2$ = 12$_{10}$ = 'M', onde os dois últimos bits no último dígito base64 são preenchidos com zeros para completar os 6 bits necessários.

## Veja também

* Comparação entre codificações Unicode