Warum hat jemand Verwendung einer anderen Codierung als UTF-8?
Möchte ich wissen, warum jeder Entwickler würde auf einer anderen Codierung als UTF-8.
- Meinst du, im Vergleich zu UTF-16, oder im Vergleich zu herkömmlichen nicht-Unicode-Codierungen?
- Bezogen auf programmers.stackexchange.com/questions/102205/... und programmers.stackexchange.com/questions/40063/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wikipedia listet die Vorteile und Nachteile von UTF-8 gegenüber einer Vielzahl von anderen Codierungen:
Die wichtigsten Nachteile sind IMHO, dass UTF-8 verwenden könnte deutlich mehr Platz, vor allem in asiatischen Sprachen wie Chinesisch, Japanisch oder Hindi und nicht alle code-points haben die gleiche Größe die macht Messungen schwieriger und viele string-Operationen wie die Suche ineffizient.
Gut, einige tun es, weil Ihre Werkzeuge sind archaisch oder fehlerhaft. Einige tun es, weil Sie don ' T sehen die Notwendigkeit, die Unterstützung alles andere als ASCII. Einige tun es, weil Sie es nicht besser wissen.
Das sind die üblichen Ausreden für nicht Unicode verwenden.
Als für nicht mit UTF-8 speziell dafür gibt es verschiedene Gründe. Einige Systeme, wie Windows1 (und die aus dass .NET) und Java, kam zu sein in einer Zeit, wo Unicode wurde eine strenge 16-bit-code. Daher gab es eigentlich nur eine Kodierung UCS-2, Codierung code Punkte direkt als 16-bit-Worten.
Später Unicode wurde erweitert, um 21 bits, da 65536 code points waren nicht mehr genug. Dies verursacht Kodierungen wie UTF-32 und UTF-16 zu erscheinen. Für Systeme, die zuvor mit UCS-2 die Umstellung auf UTF-16 war die einfachste und vernünftigste Wahl. Windows hast, dass der übergang zurück in Ye Olde Tagen von Windows 2000.
Also, während ich denke, dass fast alle Anwendung heute unterstützen sollte Unicode ich nicht denke, es ist durchaus notwendig, dass Sie speziell für die Verwendung der UTF-8. Es gibt historische Gründe dafür und keinen wirklichen Vorteil in der Umwandlung von bestehenden Systemen von UTF-16 zu UTF-8.
1 NT.
In UTF-8-Codepunkte zwischen
0800
undFFFF
bis drei bytes in UTF-8, aber nur zwei in UTF-16. Finden Sie die wikipedia-Vergleich für mehr details, aber grundsätzlich wenn der text stark wird code verwendet, der Punkte in diesem Bereich (sagen wir, wenn es Chinesisch), UTF-8-Dateien, die größer sein wird als UTF-16-Dateien mit dem gleichen Inhalt.UTF-8 ist sehr effizient bei der Codierung plain English text (wie ASCII). Wenn Ihre user-base ist wahrscheinlich meistens, sagen wir, Chinesisch, werden Sie viel besser mit UTF-16.
Weitere Informationen finden Sie unter Das Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets.
Manchmal sind Sie eingeschränkt durch historische/nicht unterstützte Gründen (ich entwickle unter Windows und der Verwendung von Zend Studio auf einem Samba-share auf einem Linux-Rechner, und etwas in dieser Mischung bedeutet, ich halte die Rückkehr zu Cp1512 statt UTF8).
Manchmal brauchen Sie nicht, um die Verwendung von UTF-8 (zum Beispiel beim speichern einen md5-hash in einer Datenbank: Sie müssen nur die hexadezimalen Bereich 0-9 A-F: warum machen Sie es eine UTF-8-Bereich, der mindestens ein byte zusätzlichen Speicherplatz, statt der normalen ASCII).
Manchmal ist es nur Faulheit lernen die UTF-8-Funktionen für eine bestimmte Sprache.
Weil Sie es nicht besser wissen.
Der einzige wirkliche Kritikpunkt an utf-8 ist, dass die Codierungen für die gängigen asiatischen Sprachen in übergröße von anderen Codierungen.
UTF-8 ist besser, weil
Sagen, Sie haben diese UTF-16-string.
Und Sie einfügen wollen, um ein Zeichen mit code 8 zwischen [3] und [4]
Sie würde tun, insert(5,8)
Wenn Sie nicht überprüfen Sie für Zeichen außerhalb der BMP(Seriell als in UTF-8, da Sie nicht wissen, wie viele doppelte Größe Zeichen, die Sie haben) erhalten Sie:
Zwei neue sinnlose Zeichen. So viel für Ihre Feste Größe-Codierung.
Natürlich können Sie zu verbieten, solche Zeichen insgesamt, sondern dann, wenn Ihr code Schnittstellen mit der realen Welt, finden Sie vielleicht Ihr Programm speichert das Profil für diesen Benutzer lebt in rm -Rf /in .Profil statt [Klassische chinesische Sprichwort].Profil.
Oder einfach nur ein verärgerter user, die nicht schreiben kann, seine Dissertation über das Klassische chinesische Sprichwörter mit Ihrer software.
Weil außerhalb der englischsprachigen Welt, die Menschen wurden mit verschiedenen Kodierungen, die Sie vorher Unicode und sind maßgeschneidert für Ihren jeweiligen Sprachen seit Jahrzehnten. Diese sprachspezifischen Codierungen haben sich tief verwurzelt sind überall und Sie sind ziemlich viel ein standard. Wenn Sie möchten, um die Hoffnung auf die Anbindung der legacy-Systeme, Sie müssen Sie nutzen, damit alle Systeme haben, um Sie zu unterstützen und in der Regel verwenden Sie Sie als Voreinstellung, auch wenn Sie mittlerweile Unterstützung von UTF-8 als gut. Es kann sogar sein, dass mehrere legacy-Kodierungen, die traditionell verwendet für verschiedene Zwecke.
Beispiele:
Die letzten beiden Beispiele zeigen, dass die Codierungen können sogar eine politische Frage.
Einen berechtigten Grund ist, wenn Sie benötigen, um mit alten Dokumenten, software oder hardware, die nicht Unicode-kompatibel.
Einem anderen legitimen Grund dafür ist, dass Sie brauchen, um eine Programmiersprache /- Bibliotheken, die keine Unterstützung für UTF8 /Unicode-naja ... oder überhaupt.
Anderen Antworten erwähnt, dass UTF-16 ist kompakter als UTF-8 für asiatische Sprachen /Zeichen.
- Und natürlich gibt es Gründe, wie Kurzsichtigkeit, Ignoranz, Faulheit ... und Termine.
Es ist auch daran zu erinnern, dass in einigen Fällen (wo ein nicht-lateinische Satz von Zeichen erforderlich sind) UTF-8 kann tatsächlich aufblasen größer als die 16-bit-Unicode-Codierung. In jenen Fällen, In ucs-2 oder utf-16 wäre eine bessere Wahl.
http://www.personal.psu.edu/ejp10/blogs/gotunicode/2007/02/cjk-unicode-angst-in-japan-and.html hat eine gute Zusammenfassung + links über die Schwierigkeit, japanische Benutzer haben mit Unicode.
http://www.hastingsresearch.com/net/04-unicode-limitations.shtml
Anscheinend Unicode ist eine Abkehr von der Vereinigung aufgrund solcher Beschwerden.
Die Gründe für die Verwendung von nicht-Unicode 8-bit-Zeichensätzen /Codierungen sind alle wieder Kompatibilität irgendwelcher Art, und/oder Trägheit. Für diese Angelegenheit, die meisten häufige Gründe für die Verwendung von UTF-8 sind die Kompatibilität mit standards wie XML, Auftrag oder doch lieber UTF-8.
Unterschiede in der Anzahl der bytes, die Sie denken, wird der text in verschiedenen Kodierungen, vor allem im Lager, sind größtenteils theoretischer Natur. In der realen Welt Situationen, Verträglichkeit Anforderungen sind wichtiger. Wenn die Komprimierung verwendet wird, die Größe der Unterschiede Weggehen sowieso. Auch wenn die Kompression nicht verwendet werden, die Gesamt-text-Größe ist schwer zu prognostizieren ist selten ein entscheidender Faktor.
Beim konvertieren von legacy-code verwendet, die nicht-Unicode 8-bit-Kodierungen, UTF-16 kann ein Werkzeug sein, um sicherzustellen, dass alle code umgewandelt wurde, weil Diskrepanzen können gefangen werden, compile-time-Typ-Fehler. Viele Sprachen, runtimes und libraries wie Javascript, JVM, .NET, die ICU verwenden 16-bit-strings und UTF-16, obwohl Speicher und Internet-Protokolle sind in der Regel 8-bit.
Sich vorstellen, alle Dateien zu prüfen, sind in GB2312 (China-Festland-standard). Dann könnten Sie von GB18030 als Unicode-Codierung statt. Sie sind kompatibel die gleiche Weise wie bei ASCII in UTF-8. Das ist nützlich in China-Festland!
Beschließen Sie vielleicht sogar schneller, wenn Sie herausfinden, dass beide genannten GB-standards erforderlich sind, in Ihr IT-Produkt durch das Gesetz (soweit ich gehört habe), wenn Sie wollen, zu Schiff in China (Festland).
Ein weiterer Vorteil ist, dass GB2312, und als solche von GB18030 als gut, sind auch ASCII-kompatibel.
Es ist algorithmisch nicht so robust, obwohl. – Also, wenn Sie haben keine politischen Gründe oder irgendwelche GB2312 Erbe, es macht keinen Sinn, es zu benutzen. Aber wenn Sie das tun, hier hast du deine Antwort.
Bezug auf das Thema, wenn Sie MySQL verwenden, als ob es noch nicht kompliziert genug ist, können Sie die option wählen, welche Art von UTF-8 collation, die Sie verwenden möchten. Also, was würden Sie verwenden?
UTF-8 general ci
oder
UTF-8 unicode ci
?(Ich Neige dazu, verwenden Sie die UTF-8-Variante, die verwendet wird, für die Datenbank-Verbindung)
Weil Sie manchmal wollen, arbeiten Sie leicht auf codepoints -- dann würden Sie Sie f.e. UCS-2 oder UCS-4.
Viele APIs erfordern andere Unicode-Kodierungen - meist UTF-16. Zum Beispiel, Java, .NET, Win32.
Bei meinem vorherigen Arbeitgeber haben wir verwendet iso-8859-1 für einige unserer ASP-Seiten entsprechend der Sortierung unserer SQL-Server, der wie Sie sich vorstellen können, war nicht in Unicode. Ich wollte um die Sortierung zu ändern, aber, sagte der manager zu warten, bis wir aktualisieren unsere SQL-Server zu tun. Unnötig zu sagen, dass es nie passiert - ich habe nicht mit Ihnen für ein wenig mehr als ein Jahr jetzt, also ich weiß nicht, ob Sie es endlich Taten.
Unicode ist sicherlich ein guter Ort zu arbeiten, in den meisten Fällen, aber ein Entwickler sollte vertraut sein mit vielen verschiedenen Arten von Zeichen-Kodierung. Sicherlich ASCII kann verwendet werden, wenn die Menge der Zeichen begrenzt ist.
Was ist, wenn du Entwickler bist und den Empfang von Daten von einer Quelle, die nicht senden UTF-8? Es könnte sein, viele Schnittstellen-Probleme, wenn Sie nicht verstehen Sie Ihre Eingabe.
Joel ' s Artikel auf die must-knows für die Zeichenkodierung ist gut und lesenswert.