utf8 oder utf16

Don_2020

Commander
Registriert
Aug. 2019
Beiträge
2.112
Habe Probleme mit dem Im- und Export von Daten zwischen verschiedenen Programmen.
In der Anwendung (Datenbank) nutzt offensichtlich utf16 (Ist eine Win10/11-App.). Da dieses System im laufe der Zeit gewachsen ist (erste Daten wurden mit Windows NT eingepflegt) möchte ich die Datenbank berenigen und alle Einträge auf eine Codierung umstellen. Nebenbei sollten noch die Einträge fehlerbereinigt werden. Da ich viel mit *nixen-Systemen arbeite und auch Latex intensiv nutze, wird utf8 bevorzugt. ein Teil der Daten soll in Latex importiert werden. Dort ist utf8 Standard.
Zur Zeit werden mir die Daten je nach Wirtssystem und Programm unterschiedlich angezeigt.

Soweit ich es verstanden habe codiert utf8 jeden Zeichen in 2 Bytes, utf16 benötigt 4 Bytes.
Sind die beiden Zeichencodierungen abwärtskompaibel? Welche Probleme können nach einer Umwandlung auftreten?
Bei Wikipedia habe ich nichts diesbezügliches gefunden. utf8 sollte eigentlich der Standard sein. Microsoft macht mal wieder was eigenes.

Exportiert wird in CSV, umgewandelt mit LibreOffice Calc und wieder per CSV in die Anwendung importiert.
 
UTF-8 ist 1-4 bytes (daher das ... 8) pro Unicode Codepoint (das ist ein Zeichen), UTF-16 ist meistens 2 bytes (am Anfang dachte man noch das wird immer 2 byte sein, aber hey, Unicode wächst). Gibt diverse APIs/Funktionen die das konvertieren können. Abwärtskompatibel und so ist da nichts, das ist zweimal das gleiche (Unicode-Codepoints werden gespeichert), nur einmal mit dem UTF-8 encoding, und einmal mit UTF-16. Das sind also genau die gleichen Daten und Du kannst das 1:1 konvertieren. Super einfach in python zum Beispiel.

Wenn Du das richtig machst, können da keine Probleme auftreten, die können genau das gleiche.
 
  • Gefällt mir
Reaktionen: BeBur und nutrix
Das ist mit dem Format nicht ganz richtig. UTF-16 nutzt 2 Byte, UTF-8 nutzt 1 bis zu 4 Byte. Kompatibel sind jeweils nur die zeichen bit ASCII 128. Nutzt die Datenbank wirkllich UTF-16?
@Anteru UTF-16 nutzt immer 2 Byte, es gibt ja noch UTF-32, das 4 byte verwendet. Bei sind aber statisch von der länge her. Weiterentwickelt wurde da nix
 
  • Gefällt mir
Reaktionen: nutrix
Don_2020 schrieb:
Soweit ich es verstanden habe codiert utf8 jeden Zeichen in 2 Bytes, utf16 benötigt 4 Bytes.
Nein, UTF16 bedarf zwei bytes oder ein Vielfaches davon (daher die 16), UTF8 bedarf minimum 1, bei Zeichen außerhalb der ASCII Plane mehr als 1, auch mal schnell 4 bei z.b. Emojis.

Nimm das Format dass deine DB nativ kann,
 
  • Gefällt mir
Reaktionen: nutrix
utf8 hat eine dynamische byte-länge. ASCII 1 byte, äöüß 2 byte, chinesisch 3 byte, emoji 4 byte (alles nur beispiele)

bei utf16 gibt es dann womöglich auch noch verschiedene bytefolgen (endian)

es ist schon ein krampf, mit dem encoding. mancherorts ist noch latin1 ...
 
  • Gefällt mir
Reaktionen: nutrix
Die Datenbank ist Microsoft SQL.
Trotzdem habe ich je nach Programm und System eine unterschiedliche Darstellung der Daten (es handelt sich ausschließlich um Buchstaben und Zahlen).

Macht man mit utf8 nichts falsch?
 
Btw, wenn du es in Windows NT zeiten schon eingepflegt hast, dann gibt es wahrscheinlich noch UCS2 und nicht nur UTF16
Ergänzung ()

Don_2020 schrieb:
Die Datenbank ist Microsoft SQL.
Welche Version, änder deine Tabellen auf NVARCHAR und vergiß den Rest, nativer UTF8 Support in SQL Server ist eine Krücke.
 
MS SQL 2022 sollte die aktuelle Version sein.

Neue Daten möchte ich über CSV einpflegen. Die manuelle Dateneingabe über die Anwendung ist ein krampf.
Ich bin Anwender, kein Programmierer.

Die Daten sind aus verschiedenen Quellen zusammenkopiert. Das läßt sich nicht mehr rekonstruieren. Braucht auch kleiner.
Was ich machen möchte ist Datenkonsolidierung. Alte Daten prüfen, fehlerbereinigen, neue Daten hinzufügen.
 
phm666 schrieb:
@Anteru UTF-16 nutzt immer 2 Byte, es gibt ja noch UTF-32, das 4 byte verwendet. Bei sind aber statisch von der länge her. Weiterentwickelt wurde da nix
Nein, es nutzt schon wie @Anteru sagt, immer zwei Byte pro Codepoint, aber gibt halt Zeichen die mehr als einen Codepoint haben, viele Emojis mit Modifikatoren zb.
 
  • Gefällt mir
Reaktionen: Anteru
Don_2020 schrieb:
Macht man mit utf8 nichts falsch?
Das kommt darauf an. Wenn Du ein Stringfeld mit 10 Zeichen hast, und Du hast 3 Umlaute drin, kannst Du hier nur noch 7 Zeichen verwenden. Bei asiatischen Schriften sind es dann noch weniger. Daran muß Du dann unbedingt denken, wenn Du das DB-Design mit der Planung der Tabellen machst.

Und wer meint, daß würde nicht oft vorkommen, ich hatte den Fall schon mehrfach, wie UTF-8 ein Problem wurde, ich sag mal als Beispiel Import bzw. Übernahme von SAP-Daten aus Japan in ein deutsches System. 😵‍💫

Bei UFT-16 hast Du dann diese Probleme eben nicht mehr, 10 Zeichen können voll genutzt werden.

Nur mal ins Gedächtnis gerufen: UTF-8 ist eine ERSATZdarstellung und war nur dafür ursprünglich gedacht, um eine übergangsweise Kompatibilität zu bestehenden Zeichensystemen zu bieten. Es sollte eigentlich gedacht nur noch UTF-16 und 32 verwendet werden. Aber wie man sieht, kommt alles anders als man denkt.
Ergänzung ()

Anteru schrieb:
UTF-8 ist 1-4 bytes (daher das ... 8) pro Unicode Codepoint (das ist ein Zeichen),
Interessant, ich hatte noch in Erinnerung, daß 1-7 Bytes in den ersten Specs verfügbar war. Sieh an, wurde in neueren Specs dann kassiert (Ungültig nach RFC 3629):
https://de.wikipedia.org/wiki/UTF-8

Ich mußte damals Parser in C und Java schreiben und spezielle Stingprüfungen einbauen, damit, wenn das Zielfeld in der Länge der DB nicht paßt, man korrekt abschneiden, und nicht ein verstümmelten UTF-8 Zeichen in die DB speichert. 😵‍💫 War einiges Kopfzerbrechen.
 
Zuletzt bearbeitet:
Danke für die ausführlichen Erläuterungen. Ich denke utf8 ist Standard bei der Zeichencodierung.
Ich werde die Daten in utf8 codieren und neu einlesen. Ein Backup habe ich.

Meine KI sagt übrigens auch ich soll utf8 nehmen.
 
Zuletzt bearbeitet:
Don_2020 schrieb:
Meine KI sagt übrigens auch ich soll utf8 nehmen.
Du weißt schon, das diese KIs keine verlässlichen und qualifizierten Aussagen treffen?
Da kannst Du genauso sagen: "Ich hab irgendwo im Internet gelesen, dass ....". Hat die gleiche Aussagekraft.
 
Anteru schrieb:
Unicode Codepoint (das ist ein Zeichen)
Nur der Vollständigkeit halber: ein Unicode Codepoint ist nicht unbedingt ein 'Zeichen' bzw. Glyph.

Don_2020 schrieb:
Soweit ich es verstanden habe codiert utf8 jeden Zeichen in 2 Bytes, utf16 benötigt 4 Bytes.
Grob gesagt ist es so: Ein 'Zeichen' (atomare Einheit der jeweiligen Sprache, z.B. ein Buchstabe) wird dargestellt durch ein oder mehrere Unicode Codepoints. Der Buchstabe "a" wird mit einem einzelnen Codepoint, nämlich U+0061 dargestellt. Der Buchstabe "ä" wird aus dem einzelnen Codepoint U+00E4 oder alternativ mit den beiden Codepoints U+0061 und U+0308 dargestellt(*).
UTF-8 ist quasi das Format in dem solche Codepoint-Sequenzen gespeichert werden. Das UTF-8 Format basiert auf 8bit langen Blöcken (code unit) und gibt z.B. an wie viele bytes das folgende 'Zeichen' hat.


(*) Durch solche Dinge muss man stark aufpassen. Z.B. gilt nicht unbedingt (pseudocde) "ä" == "ä" und nichtmal size("ä") == size("ä"). Andere Dinge die man vermuten würde, aber nicht stimmen sind z.B. size(<mystring>) == size(UPPERCASE(<mystring>) und auch sowas wie UPPERCASE(<mystring>) == UPPERCASE(LOWERCASE(<mystring>)) gilt entsprechend nicht generell.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: andy_m4 und floq0r
Zurück
Oben