Binário para texto: decodificando bytes e sabendo quando não dá
O que esta conversão faz
Lê uma sequência de bytes binários e a decodifica como texto UTF-8. Oito bits formam um byte, e depois os bytes são decodificados em conjunto, porque um único caractere pode ocupar vários deles. A etapa de decodificação é onde está o trabalho de verdade: as fronteiras dos bytes não dizem nada sobre as fronteiras dos caracteres.
Como um decodificador sabe onde um caractere termina
Os bits iniciais de cada byte anunciam seu papel. Um byte que começa com 0 fica sozinho, um que começa com 110 abre um caractere de dois bytes, 1110 abre um de três bytes e 11110 abre um de quatro, enquanto os bytes de continuação começam com 10. Essa estrutura é o que permite a um decodificador percorrer um fluxo sem que ninguém diga onde estão os caracteres, e é também o que torna detectável um fluxo cortado no lugar errado.
Tabela de conversão de binário para texto
Sequências de bytes com o texto que elas decodificam. As linhas multibyte mostram o padrão de bits iniciais fazendo seu trabalho, e a última linha mostra como se parecem bytes crus que não são texto imprimível.
| Binário | Texto |
|---|---|
| 01000001 | A |
| 01100001 | a |
| 01001000 01101001 | Hi |
| 01001111 01001011 | OK |
| 00110001 00110010 00110011 | 123 |
| 11100100 10111000 10101101 | 中 |
De onde vêm os caracteres corrompidos
Texto embaralhado quase sempre significa que os bytes foram decodificados com a codificação errada ou cortados no deslocamento errado. Decodificar UTF-8 como se fosse uma codificação de byte único transforma um caractere de três bytes em três símbolos sem relação, e descartar um byte do início desloca todos os caracteres seguintes. As duas falhas parecem pontuação aleatória, e as duas se diagnosticam olhando os bytes, não os caracteres.
Mantenha o agrupamento de bytes intacto
Copie grupos completos de oito dígitos. Começar a colagem no meio de um byte produz uma sequência que o decodificador não consegue interpretar, e o erro que vem depois é correto, mas não é nada óbvio quanto ao ponto em que a colagem começou.
Perguntas frequentes
Como decodificar binário de volta para texto?
Divida o binário em grupos de oito dígitos, trate cada grupo como um byte e decodifique os bytes como UTF-8. A letra A é 01000001, então um único grupo decodifica para um único caractere; uma sequência mais longa decodifica para uma string maior, com alguns caracteres ocupando vários grupos.
Por que recebo um erro em vez de caracteres estranhos?
Porque a sequência de bytes não é UTF-8 válido: pode estar cortada, fora de ordem ou simplesmente não ser texto. Recusá-la é proposital; a alternativa seria substituir por caracteres de reposição, o que produz uma saída com cara de problema de decodificação mesmo quando o problema real é que aqueles bytes nunca foram texto.
Posso colar binário sem espaços entre os bytes?
Pode. Uma sequência contínua cujo comprimento seja múltiplo de oito é dividida em bytes automaticamente, então binário copiado de uma origem que omite separadores converte sem ser reformatado antes. As formas com e sem espaço significam exatamente a mesma coisa.
O que um byte acima de 127 significa sozinho?
Que ele faz parte de um caractere multibyte, e não é um caractere por si. Um byte isolado nessa faixa não tem significado UTF-8 válido e é recusado, o que é a resposta correta: o caractere a que ele pertencia está incompleto.
Isto funciona para texto em qualquer idioma?
Sim, para tudo o que o UTF-8 consegue representar, o que é praticamente todo sistema de escrita em uso, incluindo alfabetos latinos com acentos, cirílico, árabe, chinês, japonês, coreano e emoji. Uma sequência gerada pela ferramenta de texto para binário deste site sempre volta exatamente ao texto original.