Ein Tier von mir schaut sich so viele Softwareprojekte an, die Berge von Code für die Unterstützung von Zeichensätzen haben. Verstehen Sie mich nicht falsch, ich bin alle für die Kompatibilität, und ich bin froh, dass Sie mit Texteditoren Dateien in mehreren Zeichensätzen öffnen und speichern können. Was mich ärgert, ist, dass die Verbreitung von nicht universellen Zeichenkodierungen eher als "richtige Unicode-Unterstützung" als als "Problem" bezeichnet wird.
Lassen Sie mich zum Beispiel auf PostgreSQL und dessen Zeichensatzunterstützung eingehen . PostgreSQL befasst sich mit zwei Arten von Codierungen:
- Client-Codierung: Wird für die Kommunikation zwischen dem Client und dem Server verwendet.
- Serverkodierung: Zum internen Speichern von Text in der Datenbank.
Ich kann verstehen, warum es eine gute Sache ist, viele Client-Codierungen zu unterstützen. Es ermöglicht Clients, die nicht in UTF-8 arbeiten, mit PostgreSQL zu kommunizieren, ohne selbst eine Konvertierung durchführen zu müssen. Was ich nicht bekomme, ist: Warum unterstützt PostgreSQL mehrere Serverkodierungen ? Datenbankdateien sind (fast immer) von einer PostgreSQL-Version zur nächsten inkompatibel, daher ist die versionsübergreifende Kompatibilität hier nicht das Problem.
UTF-8 ist der einzige standardmäßige, ASCII-kompatible Zeichensatz, der alle Unicode-Codepunkte codieren kann (wenn ich mich irre, lassen Sie es mich wissen). Ich bin im Lager, dass UTF-8 der beste Zeichensatz ist, aber ich bin bereit, mich mit anderen universellen Zeichensätzen wie UTF-16 und UTF-32 abzufinden.
Ich glaube, dass alle nicht universellen Zeichensätze veraltet sein sollten. Gibt es einen zwingenden Grund, warum sie es nicht sollten?
quelle
Antworten:
Da Sie PostgreSQL erwähnt haben, kann ich mit einiger Autorität sagen, dass der Hauptgrund, warum serverseitige Nicht-UTF8-Codierungen so detailliert unterstützt werden, darin besteht, dass die Japaner es brauchen. Offensichtlich ist eine identische Round-Trip-Konvertierung zwischen Unicode und den verschiedenen japanischen "Legacy" -Codierungen nicht immer möglich, und in einigen Fällen unterscheiden sich die Konvertierungstabellen sogar zwischen den Anbietern. Es ist wirklich verwirrend, aber anscheinend ist es so. (Die umfassende Unterstützung von Zeichensätzen ist auch einer der Gründe, warum PostgreSQL in Japan so beliebt ist.)
Da es sich um ein Datenbanksystem handelt, besteht eine der Hauptaufgaben darin, Daten, wie vom Benutzer definiert, zuverlässig speichern und abrufen zu können, sodass eine verlustbehaftete Zeichensatzkonvertierung manchmal nicht funktioniert. Wenn Sie mit dem einem Web - Browser zu tun haben, sagt sie, wo alles , was wirklich zählt , ist , ob das Ergebnis sieht OK, dann könnte man wahrscheinlich mit Unterstützung weniger Codierungen wegkommen, aber in einem Datenbanksystem haben Sie zusätzliche Anforderungen.
Einige der anderen in anderen Antworten genannten Gründe gelten auch als Argumente. Solange die Japaner ihr Veto einlegen, kann die Unterstützung für die Charaktererstellung nicht reduziert werden.
quelle
Zwei offensichtliche Gründe: Je nach den von Ihnen gespeicherten Daten kann das Konvertieren in ein anderes Format viel Zeit und zusätzlichen Platz in Anspruch nehmen. Wenn Sie 400 Megabyte an Informationen speichern, ist es keine große Sache, den Speicherbedarf zu verdoppeln. Wenn Sie jedoch 400 Terabyte speichern, bedeutet dies etwas mehr. Das Konvertieren von 400 Terabyte Daten von Shift-JIS nach UTF-x kann ebenfalls einige Zeit in Anspruch nehmen.
Dies wird besonders schwierig, wenn Sie (zum Beispiel) Verfügbarkeitsgarantien haben, die besagen, dass die Datenbank für alle verfügbar ist, jedoch beispielsweise für 10 Minuten in einem bestimmten Jahr, und wenn Sie eine Datenbank haben, die mehrere hundert Mal pro Sekunde aktualisiert wird. Wohlgemerkt, es ist in einer solchen Situation immer noch möglich , größere Conversions zu verwalten, aber es ist nicht leichtfertig zu handhaben . In einigen Fällen kann es Jahre dauern , sich auf eine solche Umstellung vorzubereiten.
Wenn Sie mit einer Datenbank begonnen haben, die (zum Beispiel) nur ASCII unterstützt, gibt es möglicherweise gute Gründe zu diskutieren, ob es sinnvoll ist, die Unterstützung für alle diese Codierungen zu erweitern. Wenn Sie sie jedoch bereits unterstützen, kann das Löschen nur wenig bewirken Unterstützung für sie.
Beachten Sie insbesondere, dass Sie bei der Vereinfachung des Codes oder dergleichen wahrscheinlich so gut wie nichts gewinnen würden. Sie würden ohnehin noch alle Konvertierungsroutinen benötigen, um die Konvertierungen zwischen Client und Server durchführen zu können. Daher würde das Löschen der Unterstützung das Löschen eines (geringfügigen) Funktionsaufrufs in den Pfaden "Write to Disk" und "Read from Disk" bedeuten, jedoch wenig (wenn überhaupt). Wenn Sie sogar zwei Kodierungen auf der Festplatte unterstützen, würden Sie das nicht einmal erreichen - Sie hätten immer noch den Funktionsaufruf dort, und Sie würden wirklich nur den Bereich der Kodierungen einschränken, die von dieser Funktion unterstützt werden.
Zumindest wenn ich dies entwerfe, würde ich wahrscheinlich den Kern der Datenbank für die Arbeit in UCS-4 schreiben und dann Konvertierungsroutinen zwischen dem Kern und der Festplatte sowie zwischen dem Kern und dem Benutzer haben. In beiden Fällen würde ich die gleichen Routinen verwenden. Der einfachste Weg wäre also, dass der Festplattenspeicher genau die gleichen Codierungen verwendet, die Clients verwenden durften.
quelle
Es gibt einige Probleme beim Speichern von UTF-8 auf dem Server:
VARCHAR(20)
Spalte? Sind das 20 Bytes oder 20 "Zeichen" (und in Unicode, was ist ein "Zeichen", wenn Sie Zeichen, Ligaturen usw. kombinieren?). Schlimmer noch, was ist mitCHAR(20)
dem Ort, an dem tatsächlich der gesamte mögliche Speicherplatz reserviert werden muss? Ich glaube, MySQL reserviert die vierfache Anzahl von Bytes für eine UTF-8-codierte Spalte (also 80 Bytes fürCHAR(20)
), um den schlimmsten Fall zu bewältigen.Trotzdem stimme ich Ihnen zu: Legacy-Codierungen sind größtenteils sinnlos, und Unicode ist im Allgemeinen die beste Codierung für alle neuen Anwendungen. Wenn ich heute einen Datenbankserver von Grund auf neu schreiben würde, würde ich nur Unicode und überhaupt keine Legacy-Codierung unterstützen.
Der Unterschied besteht darin, dass PostgreSQL und die meisten anderen heute verwendeten Datenbankserver vorhanden waren, bevor Unicode eine praktikable Option war. Sie hatten also bereits Unterstützung für Legacy-Codierungen (sie waren damals natürlich keine Legacy-Codierungen), und es macht einfach nicht viel Sinn, den gesamten Code aus weitgehend ideologischen Gründen herauszureißen.
quelle
Nicht universelle (und insbesondere Einzelbyte-) Codierungen haben ihren Platz: Auf Systemen, die:
Das gilt heute für einige Arten von eingebetteten Geräten. Aber auf dem Desktop und im Serverraum sollten Nicht-Unicode-Codierungen inzwischen längst überholt sein.
quelle
UTF-8 ist das Beste für Sie, wenn Sie egozentrisch 1 Englisch sprechen. Wenn Sie Japaner wären, würden ungefähr 99% Ihrer Zeichen 3-4 Bytes anstelle von zwei in UTF-16 benötigen.
Nicht-lateinische Dialekte leiden auf der Größenebene wirklich unter UTF-8. Vergessen Sie nicht, dass die meisten Ihrer Kunden innerhalb weniger Jahre Chinesen sind und dass chinesisches Schreiben Millionen von Zeichen hat. Mit UTF-8 können Sie das nicht effizient aufrechterhalten.
Ansonsten, ich hasse es , wenn ich Textdokumente, die nicht in UTF- sind etwas . Ich werde oft aus dem Weg gehen, wenn ich eine ordnungsgemäße Codierung haben muss. In meinem Buch sind Nicht-Unicode-Codierungen tot.
1. Nimm den egozentrischen Teil nicht persönlich. Ich wollte eine bunte Illustration machen und ich meine es nicht wirklich.
quelle
Unicode ist grundsätzlich fehlerhaft und wird wahrscheinlich nie repariert. Es muss durch etwas Besseres, etwas wirklich Universelles ersetzt werden. Wenn etwas veraltet sein muss, ist es Unicode.
Beispielprobleme mit Unicide:
UTF8 ist ein vernünftiger Hack, aber die meisten UTF16-basierten Software ist defekt. Die meisten Windows-Apps, die Unicode unterstützen, verwenden UTF16, einschließlich des Betriebssystems. Das häufigste Problem besteht darin, nicht mehr als die Grundebene zu unterstützen, dh Zeichen mit mehreren Wörtern.
Die Han-Vereinigung ist eine absolute Katastrophe. Es ist unmöglich, japanischen / chinesischen / koreanischen Text ohne zusätzliche Metadaten in einem einzigen Dokument zu mischen, und es ist schwierig zu erkennen, welche Schriftart verwendet werden soll.
Kombinationszeichen sind eine weitere Katastrophe. Sinnvollere Codierungsschemata ordnen ein Zeichen einem Code zu, wodurch die Verarbeitung von Zeichenfolgen relativ sinnvoll ist. Unicode nicht. Unicode ist nicht einmal konsistent - Han-Zeichen sind meist Kombinationen, werden jedoch nicht als solche codiert, wie dies bei europäischen Kombinationszeichen der Fall ist.
Die Namen einiger Personen können in Unicode nicht richtig geschrieben werden oder neigen aufgrund der oben genannten Probleme dazu, falsch gerendert zu werden. Dies kann schwerwiegende Folgen haben, z. B. wenn Sie versuchen, ein Flugzeug mit einem Pass zu betreten, der nicht mit dem übereinstimmt, was (falsch) auf dem Ticket angegeben ist.
Aufgrund dieser und weiterer Probleme können viele nicht-englische Programme Unicode nicht verwenden und sind auf lokale Zeichenkodierungen angewiesen. Dies ist insbesondere bei japanischer und chinesischer Software der Fall.
Im Idealfall sollte Unicode veraltet sein. Die TRON-Zeichenkodierung ist ein ziemlich guter Ersatz für Unicode und weitgehend kompatibel mit vorhandener Software, die nicht aktualisiert wird.
quelle
Vielleicht zum Schreiben, aber nicht zum Lesen.
Es gibt eine Menge existierender Inhalte, die diese Kodierungen verwenden, und einige Kodierungen wie base64 werden nicht verwendet, da einige Textprotokolle dies als Möglichkeiten zum Einbetten von Binärdaten vorschreiben.
Ein echtes Problem ist die automatische Erkennung von Codierungen, die zu Sicherheitslücken führt. Es würde mir nichts ausmachen, wenn einige obskure Codierungen wie UTF-7 einfach verschwinden.
Die automatische Erkennung hat auch die Tendenz, mit Inhalten, die durch die naive Verkettung von Bytefolgen erzeugt werden, schlecht umzugehen.
quelle
Ich kann zustimmen, dass die Standardzeichenkodierung für Datenbanken und neue Anwendungen eine Art UTF-Variante sein sollte. Ich persönlich würde mich für UTF-16 entscheiden, da es ein vernünftiger Kompromiss zwischen Platzbedarf und Komplexität zu sein scheint (mehr als UTF-8). Dennoch sind einige Zeichenkodierungen in bestimmten Fällen immer noch sinnvoll.
Beachten Sie, dass es 4 Standard-UTF-Normalisierungsalgorithmen gibt. Wenn Sie sich Gedanken über Zeichen mit mehreren Codepunkten machen, können Sie einen der beiden Normalisierungsalgorithmen verwenden, mit denen diese zu einem entsprechenden Zeichen mit einem Codepunkt zusammengefasst werden. Der Unterschied zwischen ihnen hat mit der logischen Äquivalenz und der physischen Äquivalenz von Zeichen zu tun.
quelle