Pergunta

Eu tenho um arquivo ASCII que contém um EM Dash ( - ou — em html). O valor hexadecimal é 0x97. Quando passamos esse arquivo por um aplicativo, ele chega como UTF-8 e converte o personagem para 0xc297, que é — em html. No entanto, quando passamos esse arquivo através de um aplicativo diferente, ele converte o personagem para 0xe28094 ou —.

O que causaria esses aplicativos a converter esses personagens de maneira diferente? Talvez seja uma configuração de página de código?

Foi útil?

Solução

- está errado. Quando você usa referências numéricas de caracteres, o número refere -se ao Unicode CodePoint. Para números abaixo de 256, é o mesmo que o CodePoint no ISO-8859-1. Em 8859-1, o caractere 151 está entre os "códigos de controle C1", e não um traço ou qualquer outro caractere visível.

A confusão surge porque o caractere 151 é uma corrida no código do Windows. Muitas pessoas acham que o CP1252 é a mesma coisa que ISO-8859-1, mas, na realidade, não é: os personagens da faixa C1 (128 a 159) são diferentes.

O primeiro aplicativo é ler seu arquivo "ASCII"* como ISO-8859-1, mas na verdade é provavelmente o CP1252 e você precisará de uma maneira de pisar no aplicativo sobre o que codificando ele deve esperar.

(*: "ASCII" é um nome impróprio se houver caracteres de primeira linha no arquivo. Você provavelmente quer dizer "ANSI", que também é realmente um nome impróprio, mas que ficou no mundo do Windows para significar “texto codificado Na página atual do código-padrão do sistema ”.)

Outras dicas

  • — não está em dia, seu texto foi translatado incorretamente de EM Dash para esse valor.
  • — é a entidade decimal HTML para Em Dash. Especificamente, está referenciando o ponto de código Unicode 8212, que representa um EM Dash.
  • Seu arquivo não é ASCII se ele contiver um EM Dash. Os chars ASCII codificam apenas para o intervalo decimal 0 - 127, e o EM Dash não é um caractere que pode ser representado pela codificação ASCII. Se você tiver o EM Dash armazenado como 0x97 (151 em decimal), provavelmente terá um arquivo de texto ANSI (também conhecido como Windows CodEpage 1252 (W-1252)).

Seu primeiro aplicativo ...
Os dados começaram como um EM Dash codificado no W-1252. No W-1252, o DASH EM mapeia o valor decimal 151 (0x97 em Hex, ou 10010111 em binário).

Em algum momento, o EM Dash foi tratado pelo código que pensava que os bytes do seu arquivo eram o texto codificado ISO-8859-1. Quando esse código interpretou 0x97 como uma string/char It mapeado 0x97 para um personagem de acordo com a codificação ISO-8859-1. No ISO-8859-1 0x97 mapeia o char "End of Guarded Area".

Em seguida, a string, que o código pensa que é o char "Fim da área guardada", foi codificada como UTF-8. "Fim da área guardada" codificada no UTF-8 é a sequência de dois bytes: 0xc2 0x97.

Seu segundo aplicativo ...
O arquivo de texto foi interpretado corretamente como W-1252, assim o 0x97 é reconhecido como EM Dash, que foi codificado corretamente como o DASH EM no UTF-8: 0xe2 0x80 0x94.

O que influencia esse comportamento
Não tenho certeza se você está lidando com aplicativos da Web ou o quê, mas o conceito deve ser o mesmo, seja o que for. Tínhamos o mesmo cenário 0x97-> 0xc297 em um aplicativo da web em que as pessoas inseram dados em um formulário. Descobri que o charset da página da web foi declarado como ISO8859-1, e a melhor maneira do navegador de lidar com os chars W1252 era apenas enviá-los como o ISO Bytes sem alertar o usuário ou o servidor. O servidor recebe os dados acha que é ISO e converte para o UTF-8, resultando em 0xc297.

Basicamente, sempre que um aplicativo toca o texto, é preciso saber como o texto é codificado, ou pode voltar ao padrão de um sistema. Se isso acontecer, você corre o risco de corrupção de dados.

De acordo com a especificação HTML4 Referência da entidade do personagem, o emdash é - (U+2014).

Um arquivo ASCII não pode conter o caractere 0x97, pois o conjunto de caracteres ASCII varia apenas de 0x00 a 0x7F. Portanto, seu arquivo não é ASCII, mas outra codificação de bytes. A codificação do Windows-1250, por exemplo, possui o em-dash em 0x97.

Se os aplicativos decodificarem o arquivo de texto usando outra codificação que a que foi usada para criar o arquivo, qualquer caractere acima de 0x7f estará errado.

No Unicode, o EM-DASH possui o código de caracteres 0x2014 ou 8212 em decimal.

Caráter Unicode 'em Dash' (U+2014)

Em uma página da web que, por exemplo, usa o Windows-1250 como codificação, o código — renderá como um em-dash:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>em-dash</title>
    <meta http-equiv="content-type" content="text/html; charset=windows-1250"/>
</head>
<body>
    <div>&#151;</div>
</body>
</html>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top