Algo que há muito me confunde é que muito software usa os termos "charset" e "codificação" como sinônimos.
Quando as pessoas se referem a uma "codificação" unicode, elas sempre significam um conjunto de regras para representar caracteres unicode como uma sequência de bytes - como ASCII ou UTF-8. Isso parece razoável e intuitivo; a ideia é que você esteja "codificando" esses caracteres como bytes usando o conjunto de regras especificado.
Como esses conjuntos de regras às vezes fornecem apenas a capacidade de "codificar" algum subconjunto de todos os caracteres unicode, você pode imaginar que um "conjunto de caracteres" - abreviação de 'conjunto de caracteres' - significaria simplesmente um conjunto de caracteres unicode - sem levar em consideração como esses caracteres são codificados. Assim, uma codificação implicaria um conjunto de caracteres (uma codificação como ASCII, que só possui regras para codificar 128 caracteres, seria associada ao conjunto de caracteres desses 128 caracteres), mas um conjunto de caracteres não precisará implicar uma codificação (por exemplo, UTF-8, UTF -16 e UTF-32 são todas codificações diferentes, mas podem codificar o mesmo conjunto de caracteres).
No entanto - e aqui está o cerne da minha pergunta - o uso no mundo real da palavra "charset" não corresponde ao que a construção da palavra implicaria. É quase sempre usado para significar "codificação".
Por exemplo:
- O
charset
atributo em HTML é usado para especificar uma codificação Charset
s em Java são codificaçõescharset
secharacter sets
no MySQL são, mais uma vez, codificações
Quantos anos tem esse curioso (ab) uso da linguagem e como surgiu essa definição contra-intuitiva de 'charset'? Talvez ele se origine de uma época em que realmente havia , na prática, um mapeamento individual entre codificações em uso e conjuntos de caracteres que eles suportavam? Ou havia algum padrão ou especificação particularmente influente que ditava essa definição da palavra?
fonte
charset
antecede o padrão Unicode; portanto, embora ele não tenha sido um "mapeamento individual", os caracteres necessários para um documento tendem a forçar a escolha da codificação. Mas eu não tenho tempo para pesquisar a história real da palavra ...Respostas:
O conceito de conjuntos de caracteres é mais antigo que Unicode.
Antes do Unicode, um conjunto de caracteres definia um conjunto de caracteres e como cada caracter era representado como bits. A maioria dos conjuntos de caracteres mapeou um caractere para um byte (que permitia um conjunto de 256 caracteres), alguns mapeados para dois bytes e alguns (como ASCII) para apenas 7 bits. Conjuntos de caracteres diferentes costumavam atribuir valores diferentes ao mesmo caractere e não havia uma chave de conversão universal entre os vários conjuntos de caracteres em uso.
O Unicode foi uma tentativa de resolver esse problema, unificando todos os vários conjuntos de caracteres em um "superconjunto" comum. Para esse fim, o Unicode introduziu alguns níveis adicionais de abstração, por exemplo, o conceito de codificação de caracteres como algo separado dos valores dos pontos de código. Isso permitiu que o Unicode redefinisse os conjuntos de caracteres pré-unicode como codificações de caracteres unicode.
O atributo charset em HTML (que reflete o parâmetro charset no cabeçalho do tipo de conteúdo HTTP), por exemplo, é anterior à adoção amplamente do unicode, mas quando foi decidido aceitar o unicode como o conjunto de caracteres universal da internet, o atributo charset foi redefinido para especificar a codificação em uso, mas o nome não foi alterado para permitir compatibilidade com versões anteriores.
fonte
O termo "conjunto de caracteres" é, obviamente, abreviação de "conjunto de caracteres", que por sua vez é um termo antigo usado para uma codificação de caracteres, que pode ser interpretada como a) um mapeamento entre sequências de bytes e caracteres, b) um mapeamento entre números inteiros (números de código) e caracteres ou c) um mapeamento entre caracteres abstratos e números inteiros ou sequências de bytes.
O "conjunto de caracteres" foi usado porque é uma expressão curta e simples. Nele, "conjunto" tem um significado vago (como todo o conceito é vago), mas mais tarde foi frequentemente mal interpretado como uma coleção ("conjunto" no sentido teórico do conjunto), conforme descrito no famoso conjunto de caracteres de Dan Connelly (outrora) Considerado nocivo .
O que mais importava era o identificador
charset
ser usado no MIME e no HTTP. O RFC 1945, apelido HTTP 1.0, cita a definição MIME, "um método usado com uma ou mais tabelas para converter uma sequência de octetos em uma sequência de caracteres" e depois comenta a confusão: "Esse uso do termo 'conjunto de caracteres' é mais geralmente chamado de 'codificação de caracteres'. No entanto, como HTTP e MIME compartilham o mesmo registro, é importante que a terminologia também seja compartilhada. ”fonte
O RFC2045 introduziu o "conjunto de caracteres" no MIME e, nessa época, já estava claro que nem todas as codificações mapeavam um caractere para um octeto. O RFC2130 discute esse histórico um pouco mais.
Basicamente, "charset" era um termo mais popular quando esses padrões foram escritos, é mais sucinto do que "codificação de caracteres" ou "esquema de codificação de texto" e menos ambíguo que "codificação".
fonte
Existem pelo menos 2 codificações aplicáveis à transferência de texto. A codificação de caracteres descreve como os caracteres (glifos) são codificados. Todos os idiomas usam um subconjunto do conjunto de caracteres UCS, que geralmente é codificado para um valor de 8 bits. Conjuntos de caracteres padronizados têm codificações de caracteres padrão e os termos geralmente são usados de forma intercambiável.
A codificação de transferência descreve como o texto é transferido e geralmente é independente da codificação de caracteres. A maioria das codificações de transferência não é transparente e altera a sequência de bytes que está sendo transferida. A codificação de transferência de 8 bits é transparente para codificações de 8 bits. A codificação de transferência de 7 bits pode transferir apenas conjuntos de caracteres de 7 bits, como ASCII
O ASCII usa 95 caracteres imprimíveis e mais alguns caracteres para controle de carro (avanço de linha, avanço de formulário, retorno de carro, backspace e guias) codificados em 7 bits. Existem caracteres de controle adicionais usando os valores restantes. ASCII é um subconjunto adequado dos conjuntos de caracteres UCS, bem como muitos dos conjuntos de caracteres de 8 bits. O ISO-8859-1 também é um subconjunto adequado do conjunto de caracteres UCS, mas esses caracteres têm codificação diferente no UTF-8, que usa vários bytes para valores de caracteres maiores que 127.
Os mainframes da IBM usam (d) o EBCDID, que usou uma codificação de 8 bits diferente. Existem tabelas de conversão que mapeiam os caracteres imprimíveis entre as codificações de caracteres ASCII e ECBDIC. O ECBDIC tem um conjunto de caracteres maior que o ASCII porque possui sinais de pontuação não disponíveis no ASCII. Isso pode impedir a transformação completa de ida e volta entre essas duas codificações, se a codificação inicial for ECBDIC.
Essas codificações não eram suficientes para idiomas com caracteres não cobertos pelos caracteres imprimíveis ASCII. A Microsoft e outros usaram extensões de 8 bits para o conjunto de caracteres ASCII e codificaram caracteres adicionais com valores acima de 127. Uma única extensão não era suficiente para todos os idiomas, pois essas extensões adicionavam apenas 96 caracteres ao conjunto de caracteres. Isso resultou em vários conjuntos de caracteres (conjuntos de caracteres) sendo usados para diferentes idiomas com diferentes codificações de caracteres de 8 bits. Esses conjuntos de caracteres incluem os caracteres necessários para esse idioma ou família de idiomas. Os caracteres adicionais podem ser codificados para valores diferentes em conjuntos de caracteres diferentes. Os usuários em inglês provavelmente perceberão isso com pontuação estendida (aspas esquerda e direita e traços) que aparecem incorretamente se o conjunto de caracteres errado for usado.
Para codificações de byte único, apenas caracteres no conjunto de caracteres podem ser codificados. Alguns idiomas exigiam codificações de vários bytes para cobrir seu conjunto de caracteres. O conjunto de caracteres Unicode (UCS) requer codificações de vários bytes para caracteres fora do conjunto de caracteres ASCII. Esse conjunto de caracteres é um superconjunto de todas as codificações específicas do idioma. UTF-8 é uma codificação compacta do conjunto de caracteres UCS. O ASCII não requer bytes adicionais e a maioria dos caracteres do idioma europeu (todos?) Pode ser codificada como um ou dois bytes. O conjunto completo de caracteres UCS-2 pode ser codificado em um a três bytes. Todos os caracteres no conjunto de caracteres UCS atual podem ser codificados em um a quatro bytes.
fonte
FWIW, IIRC, de volta aos 64 dias do Commodore, um conjunto de caracteres era uma função de {0, ... 255} para o conjunto de todas as imagens em preto e branco uxv em que u e v eram talvez 8 e 12. Portanto, "alterando seu conjunto de caracteres "significava usar o comando POKE no idioma BASIC para modificar os locais de memória designados para armazenar essas imagens. Por exemplo, o código ASCII 65 significava A e a imagem de um A seria armazenada começando no endereço de memória a * 65 + b por alguns be acho que a = u * v.
fonte