Frage

Ich habe eine ASCII -Datei, die einen EM -Dash enthält ( - oder — in HTML). Der Hex -Wert ist 0x97. Wenn wir diese Datei über eine Anwendung übergeben, kommt sie als UTF-8 an und konvertiert das Zeichen in 0xC297, was ist — In HTML. Wenn wir diese Datei jedoch über eine andere Anwendung übergeben, konvertiert sie das Zeichen in 0xE28094 oder —.

Was würde dazu führen, dass diese Anwendungen diese Zeichen unterschiedlich konvertieren? Ist es vielleicht eine Code -Seiteneinstellung?

War es hilfreich?

Lösung

- ist falsch. Wenn Sie numerische Zeichenreferenzen verwenden, bezieht sich die Nummer auf den Unicode -CodePoint. Für Zahlen unter 256 ist dies der gleiche wie der CodePoint in ISO-8859-1. In 8859-1 gehört Charakter 151 zu den „C1-Kontrollcodes“ und nicht zu einem Armaturenbrett oder einem anderen sichtbaren Charakter.

Die Verwirrung entsteht, weil Zeichen 151 ein Armaturenbrett in Windows Code Seite 1252 (westeuropäisch) ist. Viele Leute denken, CP1252 ist dasselbe wie ISO-8859-1, aber in Wirklichkeit ist es nicht: Die Charaktere im C1-Bereich (128 bis 159) sind unterschiedlich.

Die erste Anwendung ist die Lesung Ihrer "ASCII" -Datei* als ISO-8859-1, aber tatsächlich ist sie wahrscheinlich CP1252 und Sie müssen die App darüber hinweisen, was sie erwarten muss.

(*: „ASCII“ ist eine Fehlbezeichnung, wenn in der Datei Top-Bit-Set-Zeichen vorhanden sind. Sie bedeuten wahrscheinlich „ANSI“, was wirklich auch eine Fehlbezeichnung ist, aber eines, das in der Windows-Welt so gesteckt ist, dass sie „Text codiert“ bedeutet Auf der aktuellen System-Default-Code-Seite ”.)

Andere Tipps

  • — ist nicht em Dash, Ihr Text wurde von Em Dash zu diesem Wert falsch übertragen.
  • — ist die HTML -Dezimaleinheit für EM Dash. Insbesondere verweist es auf den Unicode -Codepunkt 8212, der einen EM -Dash darstellt.
  • Ihre Datei ist nicht ASCII, wenn sie einen EM -Dash enthält. ASCII -Zeichen kodieren nur zum Dezimalbereich 0 - 127, und EM Dash ist kein Zeichen, das durch ASCII -Codierung dargestellt werden kann. Wenn Sie EM Dash als 0x97 (151 in Dezimal) gespeichert haben, haben Sie wahrscheinlich eine ANSI-Textdatei (auch bekannt als Windows CodePage 1252 (W-1252)).

Ihre erste App ...
Die Daten begannen als EM-Dash in W-1252. In W-1252 karten die EM-Dash den Dezimalwert 151 (0x97 in Hex oder 10010111 in Binär).

Irgendwann wurde der EM-Dash mit Code bearbeitet, der dachte, die Bytes in Ihrer Datei seien ISO-8859-1 codierter Text. Wenn dieser Code 0x97 als String/Zeichen interpretierte Zugeordneter 0x97 auf einen Charakter gemäß der ISO-8859-1 Codierung. In ISO-8859-1 0x97 Karten zum char "Ende des geschützten Bereichs".

Als nächstes wurde die Zeichenfolge, von der der Code glaubt, dass es sich um das "Ende des schützten Bereichs" -Kontrollkosten handelt, als UTF-8 codiert. "Ende der geschützten Fläche" in UTF-8 codiert ist die Zwei-Byte-Sequenz: 0xc2 0x97.

Ihre zweite App ...
Die Textdatei wurde korrekt als W-1252 interpretiert, daher wird der 0x97 als EM-Dash erkannt, das korrekt als EM-Dash in UTF-8: 0xE2 0x80 0x94 codiert wurde.

Was beeinflusst dieses Verhalten
Ich bin mir nicht sicher, ob Sie mit Web -Apps oder was zu tun haben, aber das Konzept sollte das gleiche sein, was auch immer es ist. Wir hatten das gleiche 0x97-> 0xC297-Szenario in einer Web-App, in der Personen Daten in ein Formular eingeben. Ich stellte fest, dass der Zeichen der Webseite als ISO8859-1 deklariert wurde und der beste Weg des Browsers, die W1252-Zeichen zu verarbeiten, bestand darin, sie als ISO-Bytes zu senden, ohne den Benutzer oder den Server aufmerksam zu machen. Der Server empfängt die Daten, dass es sich um ISO handelt und in UTF-8 konvertiert, was zu 0xC297 führt.

Grundsätzlich muss eine App, die einen Text berührt, mit gesagt werden, wie der Text codiert wird, oder sie kann auf eine Systemstandliste zurückfallen. In diesem Fall riskieren Sie Datenversorgung.

Nach Angaben der HTML4 -Spezifikation der Spezifikationen Charakterentitätsreferenz, der Emdash ist - (U+2014).

Eine ASCII -Datei kann das Zeichen 0x97 nicht enthalten, da das ASCII -Zeichen nur von 0x00 bis 0x7f reicht. Daher ist Ihre Datei nicht ASCII, sondern eine andere einzelne Byte -Codierung. Die Windows-1250-Kodierung hat beispielsweise den EM-Dash-Wert bei 0x97.

Wenn die Anwendungen die Textdatei unter Verwendung einer anderen Codierung dekodieren als die, die zum Erstellen der Datei verwendet wurde, ist jedes Zeichen über 0x7f falsch.

In Unicode hat der EM-Dash den Zeichencode 0x2014 oder 8212 in Dezimal.

Unicode -Zeichen 'em Dash' (U+2014)

In einer Webseite, die beispielsweise Windows-1250 als Codierung verwendet, wird der Code als Codierung verwendet — wird als EM-Dash rendern:

<!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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top