it-swarm.dev

Quais caracteres não são mapeados diretamente do Cp1252 para o UTF-8?

Eu li em várias respostas do stackoverflow que alguns caracteres não mapeiam diretamente (ou são "não mappable") ao converter do Cp1252 (também conhecido como Windows-1252; são iguais, não são?) Para UTF-8, por exemplo aqui: https://stackoverflow.com/a/23399926/2018047

Alguém pode, por favor, lançar mais alguma luz sobre isso? Isso significa que, se eu converter em lote/massa o código-fonte de cp1252 para utf-8, receberei alguns caracteres que acabarão como lixo?

9
Christian

É assim que a página de código do Windows 1252 se parece.

Como você pode ver, os bytes 0x81, 0x8D, 0x8F, 0x90, 0x9D não têm nada atribuído a eles.

Se o seu arquivo de entrada contiver esses bytes e você o tratar como se estivesse na codificação do Windows 1252, esses bytes serão tratados como caracteres inválidos. Em circunstâncias normais, isso significa que o arquivo de entrada não estava no Windows 1252.

Todos os outros bytes codificam caracteres imprimíveis ou caracteres de controle, e todos esses caracteres estão presentes no Unicode e, portanto, podem ser codificados sem ambiguidade no UTF-8.

Não tenho idéia do que a resposta vinculada está tentando reivindicar; seu último parágrafo parece uma bobagem.

Várias outras observações, que podem esclarecer o que você está tentando conhecer:

  • UTF-8 e Windows 1252 são totalmente incompatíveis entre si fora do ASCII

  • essas duas codificações nunca codificarão texto para determinados valores de bytes, diferentes em cada caso

  • além disso, certas seqüências de bytes também são inválidas no UTF-8

  • em geral, se você tratar um arquivo como se contivesse texto codificado em UTF-8 ou Windows 1252, mas não o fizer, você perderá e corromperá os dados

Você pode selecionar a codificação dos seus arquivos no seu IDE ou editor. É recomendável usar somente UTF-8. Você precisará converter os arquivos existentes do Windows 1252.

11
Karol S

Alguém pode esclarecer um pouco mais sobre isso?

A função de decodificação cp1252 é principalmente uma função de identidade.

cp1252    UCP       (UCP = Unicode Code Point)
--------  --------
21        21 (!)    (All numbers in hex)
31        31 (1)
41        41 (A)

Isso faz com que pareça algo que espera que o UCP (não o UTF-8) também aceite o cp1252. O autor da resposta vinculada está apontando que esse não é o caso.

cp1252    UCP
--------  --------
80        20AC (€)
85        2026 (…)
99        2122 (™)

As exceções são todas encontradas entre 80 e 9F, inclusive.

Algo que aceite UCP também aceitará iso-8859-1 , mas não o cp1252.


Isso significa que, se eu converter em lote/massa o código-fonte de cp1252 para utf-8, receberei alguns caracteres que acabarão como lixo?

Não. Cada caractere no cp1252 é mapeado para um Código Unicode, para que possa ser convertido com êxito em UTF-8.

2
ikegami