myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » Wieso werden Umlaute nach dem (De)Serialisieren von CSV-Dateien nicht richtig dargestellt (UTF-7)?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wieso werden Umlaute nach dem (De)Serialisieren von CSV-Dateien nicht richtig dargestellt (UTF-7)?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Duesmannr Duesmannr ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.04.2017
Beiträge: 119
Entwicklungsumgebung: Visual Studio 2017/19
Herkunft: Münster


Duesmannr ist offline

Wieso werden Umlaute nach dem (De)Serialisieren von CSV-Dateien nicht richtig dargestellt (UTF-7)?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Moin,

ich habe ein Problem mit der De-/serialisierung von deutschen Umlauten.

C#-Code:
List<Country> countries1 = new List<Country>
{
    new Country
    {
        Name = "Ägypten"
    }
};

string json = JsonSerializer.Serialize(countries1);

List<Country> deserializedCountry = JsonSerializer.Deserialize<List<Country>>(json);

Funktioniert wunderbar. Ägypten steht wieder ganz normal drin.

Im Json selbst, steht dann der String:

[{"Id":"53b1b01c-2a33-48ee-9f21-c0a20f6f96bc","Name":"\u00C4gypten","ISOAlpha2":null,"ISOAlpha3":null,"States":null,"Sources":null}]

Weil der den Umlaut encoded. Das passt ja alles.

Wenn ich das ganze dann aber erweiter:

C#-Code:
using StreamReader sr = new StreamReader("Countries.csv", Encoding.UTF8);
string line;
int skipLine = 2;
List<Country> countries = new List<Country>();

while ((line = sr.ReadLine()) != null)
{
    if (skipLine > 0)
    {
        skipLine--;
        continue;
    }

    string[] values = line.Split(";");

    countries.Add(new Country
    {
        Name = values[0],
        ISOAlpha2 = values[1],
        ISOAlpha3 = values[2]
     });
}

json = JsonSerializer.Serialize(countries);

deserializedCountry = JsonSerializer.Deserialize<List<Country>>(json);

Sind alle Länder der Welt round about 270 stk.
Hier im Json steht der String drin (Ausschnitt)

{"Id":"5e150fc7-a81e-41c1-a87f-d9fcc80be1de","Name":"\uFFFDgypten","ISOAlpha2":"EG","ISOAlpha3":"EGY","States":null,"Sources":null},

Hier encoded der das "Ä" anders.
Und wenn ich es dann wieder deserialisiere kommt das raus:
"?gypten".

Aber wie kann ich das umgehen? Bzw. was genau ist das Problem?

Google hat auch nicht geholfen, weder zu Json.NET (was hier verwendet wird) noch zu Newtonsoft.

Ziel ist im Endeffekt, mir eine Json Datei zu erstellen, die von einem anderen Programm eingelesen wird.

Edit:
Die csv Datei ist exportiert von xlsx via Excel.
Aber nachdem ich es gepostet habe, habe ich bemerkt, dass es am Encoding vom StreamReader liegt.
Aber müsste UTF-8 nicht korrekt sein?

Dann ist es gleich zu diesen  Thema
Wo UTF-7 die Lösung ist.

Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Duesmannr am 01.10.2020 19:15.

01.10.2020 19:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.495
Herkunft: BW


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wie Du selbst mit dem Edit bemerkt hast, liegt es am Encoding.

Das Encoding bestimmst Du (oder eben die Anwendung) beim Schreiben.
Beim Lesen muss das selbe Encoding verwendet werden - immer.

Das ist ein typisches Problem beim Datenaustausch zwischen Anwendungen über Dateien.

Soweit ich weiß ist UTF-7 das default encoding für CSV Dateien via Excel.
Native Dateien wie xlsx etc sind UTF-8.

Bei CSV wird vermutlich aufgrund der nur spärlichen Möglichkeiten Sonderzeichen zu behandeln eben auf ein ASCII-nahes Encoding gesetzt; meine Vermutung.
01.10.2020 19:33 Beiträge des Benutzers | zu Buddylist hinzufügen
Platoon Platoon ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.02.2017
Beiträge: 27
Entwicklungsumgebung: VS 2015 Pro (Arbeit), VS 2017
Herkunft: NRW


Platoon ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Abt:
Soweit ich weiß ist UTF-7 das default encoding für CSV Dateien via Excel.
Native Dateien wie xlsx etc sind UTF-8.

Excel generell zu erwähnen ist etwas irreführend finde ich.

Zitat von Abt:
Bei CSV wird vermutlich aufgrund der nur spärlichen Möglichkeiten Sonderzeichen zu behandeln eben auf ein ASCII-nahes Encoding gesetzt; meine Vermutung.

CSV nutzt primär UTF-7 wobei das auch nicht in einer RFC festgeschrieben ist. Wobei das Format CSV auch oftmals nicht korrekt nach  RFC 4180 angewendet wird. Da kommen dann Piper (|), Simikola (;), Doppelpunkte etc. zum Einsatz wobei per Definition es ja eigentlich ein Komma sein sollte.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Platoon am 01.10.2020 21:51.

01.10.2020 21:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Monate.
Der letzte Beitrag ist älter als 3 Monate.
Antwort erstellen


© Copyright 2003-2021 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 25.01.2021 15:02