Domanda

Ho un file ASCII che contiene un EM Dash (& # 8212; o & amp; mdash; in HTML). Il valore esadecimale è 0x97. Quando passiamo questo file attraverso un'applicazione, arriva come UTF-8 e converte il carattere in 0xC297, che è & amp; # 151; in HTML. Tuttavia, quando passiamo questo file attraverso un'applicazione diversa, il carattere viene convertito in 0xE28094 o & amp; # 8212; .

Cosa indurrebbe queste applicazioni a convertire questi caratteri in modo diverso? È forse un'impostazione della tabella codici?

È stato utile?

Soluzione

& amp; # 151; è sbagliato. Quando si utilizzano riferimenti a caratteri numerici, il numero si riferisce al punto di codice Unicode. Per numeri inferiori a 256 che è lo stesso del punto di codice in ISO-8859-1. Nell'8859-1, il carattere 151 è tra i "codici di controllo C1" e non un trattino o qualsiasi altro carattere visibile.

La confusione sorge perché il carattere 151 è un trattino nella tabella codici Windows 1252 (Europa occidentale). Molte persone pensano che cp1252 sia la stessa cosa di ISO-8859-1, ma in realtà non lo è: i caratteri nell'intervallo C1 (da 128 a 159) sono diversi.

La prima applicazione sta leggendo il tuo file “ASCII” * come ISO-8859-1, ma in realtà è probabilmente cp1252 e avrai bisogno di un modo per capire l'app su quale codifica deve aspettarsi.

(*: "ASCII" è un termine improprio se ci sono caratteri top-bit impostati nel file. Probabilmente intendi "ANSI", che in realtà è anche un termine improprio, ma che si è bloccato nel mondo di Windows per significare "Testo codificato nell'attuale codepage di sistema".)

Altri suggerimenti

  • & amp; # 151; non è em dash , il testo è stato tradotto erroneamente da em dash a quel valore.
  • & amp; # 8212; è l'entità decimale HTML per il trattino. In particolare, fa riferimento al punto di codice Unicode 8212 che rappresenta un trattino.
  • Il tuo file non è ASCII se contiene un trattino. I caratteri ASCII codificano solo nell'intervallo decimale 0 - 127 e il trattino non è un carattere che può essere rappresentato dalla codifica ASCII. Se hai un trattino memorizzato come 0x97 (151 in decimale) probabilmente hai un file di testo ANSI (aka Windows Codepage 1252 (w-1252)).

La tua prima app ...
I dati iniziarono come un trattino em codificato in w-1252. In w-1252 il trattino em corrisponde al valore decimale 151 (0x97 in esadecimale o 10010111 in binario).

Ad un certo punto il trattino è stato gestito da un codice che pensava che i byte nel tuo file fossero testo codificato iso-8859-1. Quando quel codice interpretava 0x97 come una stringa / carattere, mappato 0x97 su un carattere secondo la codifica iso-8859-1 . In iso-8859-1 0x97 viene mappato sul carattere "Fine dell'area protetta".

Successivamente, la stringa, che il codice pensa sia la "fine dell'area protetta". control char, è stato codificato come utf-8. " Fine dell'area protetta " codificata in utf-8 è la sequenza a due byte: 0xC2 0x97 .

La tua seconda app ...
Il file di testo è stato correttamente interpretato come w-1252, quindi 0x97 è riconosciuto come dash, che è stato correttamente codificato come dash in utf-8: 0xE2 0x80 0x94.

Cosa influenza questo comportamento
Non sono sicuro se hai a che fare con le app Web o altro, ma il concetto dovrebbe essere lo stesso qualunque esso sia. Avevamo lo stesso scenario 0x97- > 0xC297 in un'app Web in cui le persone inserivano i dati in un modulo. Ho scoperto che il set di caratteri della pagina Web è stato dichiarato come iso8859-1 e il modo migliore del browser per gestire i caratteri w1252 era semplicemente inviarli come byte iso senza avvisare l'utente o il server. Il server riceve i dati pensa che sia iso e li converte in utf-8, risultando in 0xC297.

Fondamentalmente ogni volta che un'app tocca il testo, deve essere detto come viene codificato il testo, altrimenti potrebbe ricadere su un valore predefinito di sistema. In tal caso, rischi di corrompere i dati.

Secondo la riferimento entità carattere della specifica HTML4 , l'emdash è & # 8212; ( U + 2014 ).

Un file ASCII non può contenere il carattere 0x97, poiché il set di caratteri ASCII varia solo da 0x00 a 0x7F. Pertanto il tuo file non è ASCII, ma qualche altra codifica a byte singolo. La codifica windows-1250 ad esempio ha il trattino em su 0x97.

Se le applicazioni decodificano il file di testo utilizzando una codifica diversa da quella utilizzata per creare il file, qualsiasi carattere sopra 0x7F sarà errato.

In unicode l'em-dash ha il codice carattere 0x2014 o 8212 in decimale.

Carattere Unicode 'EM DASH' (U + 2014)

In una pagina web che ad esempio usa windows-1250 come codifica, il codice & amp; # 151; verrà visualizzato come un trattino:

<!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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top