Was ist eine Zeichenkodierung, und warum sollte ich mir die Mühe mit ihm
Bin ich ziemlich verwirrt über das Konzept der Zeichenkodierung.
Was ist Unicode, GBK, etc? Wie funktioniert eine Programmiersprache verwenden Sie?
Brauche ich um die Mühe, über Sie zu wissen? Gibt es eine einfachere oder schnellere Möglichkeit der Programmierung ohne Probleme mich mit Ihnen?
Das klassische off-site-Ressource für diese ist Joel Spolsky ' s essay Das Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!).
Es ist eine späte Antwort, aber ich stellte einige Erklärungen über die genannten Codierungen und Zeichensätzen + auch einige Abkürzungen (z.B. für java)
Es ist eine späte Antwort, aber ich stellte einige Erklärungen über die genannten Codierungen und Zeichensätzen + auch einige Abkürzungen (z.B. für java)
InformationsquelleAutor hguser | 2012-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Beachten Sie, dass ich Sie mit einigen dieser Begriffe Locker/umgangssprachlich für eine einfachere Erklärung, die noch zuvor auf die wichtigsten Punkte.)
Einem byte nur 256 unterschiedliche Werte, 8 bit.
Da gibt es Zeichensätze mit mehr als 256 Zeichen in den Zeichensatz kann man nicht generell einfach sagen, dass jedes Zeichen ist ein byte.
Also muss es Zuordnungen, beschreiben Sie, wie Sie jedes Zeichen in einem Zeichensatz in eine Sequenz von bytes. Einige Zeichen könnten abgebildet werden, um ein einzelnes byte, aber andere müssen zugeordnet werden, um mehrere bytes.
Diese Zuordnungen sind Codierungen, weil Sie erzählen, wie Sie zum Kodieren von Zeichen in Bytefolgen.
Als für Unicode, auf einem sehr hohen Niveau, Unicode ist ein Versuch, eine einzelne, eindeutige Nummer für jedes Zeichen. Natürlich, die Zahl ist etwas breiter als ein byte, da es mehr als 256 Zeichen 🙂 Java verwendet eine version von Unicode, wo jedes Zeichen zugeordnet ist, einen 16-bit Wert (und das ist der Grund, warum Java-Zeichen werden 16 bit Breite integer-Werte von 0 bis 65535). Wenn man die byte-Repräsentation eines Java-Charakter, muss man sagen, die JVM die Codierung, die Sie verwenden möchten, es wird also wissen, wie zu wählen Sie die byte-Folge für den Charakter.
InformationsquelleAutor QuantumMechanic
ASCII ist grundlegend
Ursprünglich 1 Charakter war immer gespeichert als 1 byte. Ein byte (8 bits) hat das Potenzial zu deutlichen 256 mögliche Werte. Aber in der Tat nur die ersten 7 bits verwendet wurden. Also nur 128 Zeichen definiert wurden. Dieser Satz ist bekannt als der ASCII-Zeichensatz.
0x00
-0x1F
enthalten Lenkung codes (z.B. CR, LF, STX, ETX, EOT, BEL, ...)0x20
-0x40
enthalten, zahlen und Satzzeichen0x41
-0x7F
enthalten hauptsächlich Buchstaben0x80
-0xFF
8. bit = undefined.Französisch, Deutsch und viele andere Sprachen erforderlich, zusätzlichen Zeichen. (z.B.
à, é, ç, ô, ...
), die nicht im ASCII-Zeichensatz. Sie benutzten also das 8. bit zu definieren, Ihre Zeichen. Dies ist, was ist bekannt als "erweiterten ASCII -".Das problem ist, dass die zusätzlichen 1-bit hat nicht genug Kapazität, um alle Sprachen der Welt. So hat jede region seine eigenen ASCII-Variante. Es gibt viele erweiterte ASCII-Codierungen (
latin-1
einem sehr beliebten).Beliebte Frage: "Ist der ASCII-Zeichensatz oder ist es eine Codierung" ?
ASCII
ist ein Zeichen gesetzt. Jedoch, in der Programmierungcharset
undencoding
sind Wild als Synonyme verwendet. Wenn ich will, zu finden, um eine Codierung, die nur die ASCII-Zeichen enthält und nichts mehr (das 8. bit ist immer 0):US-ASCII
.Unicode geht noch einen Schritt weiter
Unicode ist ein großartiges Beispiel für ein Zeichensatz, keine Codierung. Es verwendet die gleichen Zeichen wie der ASCII-standard, aber es reicht, die Liste mit zusätzlichen Zeichen, die jedem Zeichen einen Codepunkt im format
u+xxxx
. Es hat den Ehrgeiz, alle Zeichen enthalten (und beliebte Symbole) auf der ganzen Welt genutzt.UTF-8, UTF-16 und UTF-32 Kodierungen, gelten die Unicode-Zeichentabelle. Aber Sie haben jeweils eine etwas andere Art und Weise auf, wie um Sie zu Kodieren. UTF-8 wird nur 1 byte bei der Kodierung eines ASCII-Zeichens, geben Sie die gleiche Ausgabe wie jede andere ASCII-Codierung. Aber für andere Zeichen verwenden, wird das erste bit, um anzuzeigen, dass ein 2. byte Folgen.
GBK ist eine Codierung, die genauso wie UTF-8 verwendet mehrere bytes. Das Prinzip ist ziemlich das gleiche. Das erste byte folgt die ASCII-standard, also nur 7 bit genutzt werden. Aber ebenso wie mit UTF-8, Das 8. bit kann verwendet werden, um das Vorhandensein einer 2. byte, die es dann verwendet, um codieren einer von 22.000 chinesischen Zeichen. Der wichtigste Unterschied ist, dass diese folgt nicht dem Unicode-Zeichensatz, dagegen verwendet er einige chinesische Zeichen set.
Entschlüsselung von Daten
Wenn Sie die Verschlüsselung Ihrer Daten verwenden, verwenden Sie eine Verschlüsselung, aber wenn Sie die Daten entschlüsseln, müssen Sie wissen, welche Kodierung verwendet wurde, und verwenden die gleiche Codierung zu entschlüsseln.
Leider Codierungen sind nicht immer deklariert oder angegeben. Es wäre ideal, wenn alle darin enthaltenen Dateien ein Präfix angeben, welche Kodierung Ihre Daten wurde gespeichert. Aber noch in vielen Fällen Anwendungen müssen nur vermuten oder raten, welche Kodierung Sie verwenden sollten. (z.B. Sie verwenden das standard-encoding des Betriebssystems).
Es ist immer noch ein Mangel an Bewusstsein über diese, wie noch viele Entwickler gar nicht wissen, was eine Verschlüsselung ist.
Mime-Typen
Mime-Typen sind manchmal verwirrt mit Codierungen. Sie sind eine sinnvolle Art und Weise für den Empfänger zu identifizieren, welche Art von Daten angekommen. Hier ist ein Beispiel, wie das HTTP-Protokoll definiert den content-type mit einem mime-type-Angabe.
- Und das ist eine andere große Quelle der Verwirrung. Mime-Typ beschreibt welche Art von Daten eine Nachricht enthält (z.B.
text/xml
,image/png
, ...). Und in manchen Fällen wird es zusätzlich auch beschreiben wie die Daten codiert werden (d.h.charset=utf-8
). 2 Punkte der Verwirrung:charset=utf-8
addiert sich zu der semantischen Verwirrung, da wie bereits zuvor erläutert, UTF-8 ist eine Kodierung und nicht ein Zeichen gesetzt. Aber wie bereits erwähnt, einige Leute benutzen Sie einfach die 2 Wörter Synonym.Beispielsweise im Fall von
text/xml
es wäre sinnlos, zu erklären, eine Verschlüsselung (und eincharset
- parameter einfach ignoriert werden). Stattdessen XML-Parser im Allgemeinen liest die erste Zeile der Datei, auf der Suche nach der<?xml encoding=...
tag. Wenn Sie da ist, dann werden Sie öffnen Sie die Datei mit diesem encoding.Das gleiche problem besteht beim senden von e-mails. Eine e-mail enthalten kann, eine html-Nachricht oder einfach nur plain text. Auch in diesem Fall die mime-Typen werden verwendet, um zu definieren, die Art der Inhalte.
Aber in der Zusammenfassung, mime-Typ ist nicht immer ausreichend, um das problem zu lösen.
Datentypen in Programmiersprachen
Im Fall von Java (und vielen anderen Programmiersprachen) zusätzlich zu den Gefahren von Codierungen, es ist auch die Komplexität der casting-bytes und integers zu Zeichen, da deren Inhalt gespeichert ist, in verschiedenen Bereichen.
-128
zu127
).char
Datentyp in java ist gespeichert in 2 unsigned Byte (Bereich:0
-65535
)-1
zu255
.Wenn Sie wissen, dass Ihre Daten enthält nur ASCII-Werte. Dann mit dem richtigen Geschick können Sie analysieren Ihre Daten aus bytes Zeichen oder wickeln Sie Sie sofort in die Saiten.
Verknüpfungen
Die Verknüpfung in java ist die Verwendung von Leser und Schreiber und an die Kodierung angeben, die beim instanziieren.
Wie zuvor beschrieben für XML-Dateien, die es spielt keine Rolle, dass viel, weil jeder anständige DOM oder JAXB marshaller wird prüfen, ob ein encoding-Attribut.
Interessant ist auch die BOM (byte-order-mark), die verwendet wird, für die Verschlüsselungen, die die Verwendung mehrerer bytes (z.B. UTF-16). Es zeigt an, welche der bytes ist das erste (bedeutendste). Diese marker-byte vor der Nachricht. Ein weiterer guter Grund für die Verwendung anständige
Reader
s.Die Tabelle Zeichen von Unicode ist eine Codierung per definition, trotzdem ist es doppelt codiert in ich. e. UTF-8. Deshalb ist es einfach falsch, dass Unicode ist keine Kodierung.
Ich wollte nicht schreiben "unicode hat keine Codierung". Unicode-Kodierungen (z.B. UTF-8, UTF-16, ... etc .) Bot diese sind Implementierungen. Unicode selbst ist ziemlich einfach, wie "das alphabet", es ist nur eine Liste von Zeichen. Das ist, warum Unicode nicht eine Zeichencodierung. Eine Codierung auf der anderen Seite soll beschreiben, wie die Informationen gespeichert werden in bits und bytes. - Ich habe keine Ahnung, was du meinst mit "doppelt codiert". Beziehen Sie sich auf die Tatsache, dass es mehrere unicode-Implementierungen ? (Mach mir da Zustimmen).
Keine "A codiert - Zeichensatz ist ein Satz von Zeichen, für die eine eindeutige Nummer zugeordnet zu jedem Charakter. "Dies ist die gleiche definition, die ich aus wikipedia. 😉
InformationsquelleAutor bvdb
Zeichenkodierung ist, was Sie verwenden, um zu lösen das problem des Schreibens-software für jemanden, der eine andere Sprache verwendet, als Sie tun.
Du nicht weißt, wie das, was die Charaktere sind und wie Sie geordnet sind. Daher, Sie wissen nicht, was die Streicher in diese neue Sprache Aussehen wird, binäre und ehrlich gesagt, kümmert man sich nicht.
Was Sie zu tun haben ist eine Möglichkeit zum übersetzen von strings aus der Sprache, die Sie sprechen, die Sprache, die Sie sprechen (sagen, ein übersetzer). Sie brauchen jetzt ein system, das fähig ist, die beide Sprachen im binären ohne Konflikte. Die Codierung ist, dass system.
Ist es, was Ihnen erlaubt software zu schreiben, die funktioniert unabhängig von der Art und Weise Sprachen vertreten sind binäre.
InformationsquelleAutor Carl