UTF-8 mit Umlauten bei loaddata

Django, Flask, Bottle, WSGI, CGI…
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Ich habe diese Frage als eine von mehreren in meinem letzten Post eingefügt, habe jetzt aber noch ein bißchen rumprobiert und Frage hier noch mal explizit:
Wenn ich mit "dumpdata" eine Tabelle speichere, muss ich sie vor dem "loaddata" in UTF- kodieren - oder nicht?
Dabei gehen die Umlaute verlustig. Die kann man allerdings mit suchen und ersetzen wiederherstellen. Das anschließende "loaddata" funktioniert dann.
... geht das auch einfacher?
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Soweit mir bekannt, ist der dump in ein json-File so immer UTF-8 kodiert.
Da sollte nichts umkodiert werden müssen - und das sollte man auch nicht tun.

Warum denkst du, dass das nötig ist?
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Weil mir Django beim Versuch dies ohne Konvertierung zu machen einen Fehler angezeigt hat (das war irgendwas mit UTF-8). Darufhin habe ich das gegoogelt und einen entsprechenden Hinweis bekommen. Nach der Kodierung hat es mit loaddata geklappt. Ich probiere das nochmal:

Code: Alles auswählen

PS D:\Dropbox\RechentrainerWeb\rechentrainer_Kopie(1)> python manage.py dumpdata core.sachaufgabe --indent 2 > sachaufgabe.json
PS D:\Dropbox\RechentrainerWeb\rechentrainer_Kopie(1)> python manage.py loaddata sachaufgabe.json
Traceback (most recent call last):
  File "D:\Dropbox\RechentrainerWeb\rechentrainer_Kopie(1)\manage.py", line 22, in <module>
    main()
  File "D:\Dropbox\RechentrainerWeb\rechentrainer_Kopie(1)\manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\management\__init__.py", line 425, in execute_from_command_line
    utility.execute()
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\management\__init__.py", line 419, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\management\base.py", line 373, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\management\base.py", line 417, in execute
    output = self.handle(*args, **options)
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\management\commands\loaddata.py", line 78, in handle
    self.loaddata(fixture_labels)
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\management\commands\loaddata.py", line 138, in loaddata
    self.load_label(fixture_label)
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\management\commands\loaddata.py", line 214, in load_label
    for obj in objects:
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\serializers\json.py", line 67, in Deserializer
    stream_or_string = stream_or_string.decode()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
PS D:\Dropbox\RechentrainerWeb\rechentrainer_Kopie(1)>
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Hmmm, welches Encoding hat denn die Datei, die geschrieben wird?
Vielleicht wird da der Systemstandard verwendet. Wenn dem so ist, kannst du Python anweisen UTF-8 anstatt des Systemstandards zu verwenden.

Code: Alles auswählen

python -Xutf8 manage.py dumpdata core.sachaufgabe --indent 2 > sachaufgabe.json
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Die Datei ist wahrscheinlich als UTF-16 Little Endian kodiert (Default-Encoding unter Windows) und das 0xFF ist dann das erste Stück des Byte-Order-Mark. Das Problem ist dem Django-Team bekannt und die empfohlene Lösung scheint wohl zu sein, dass du dein Windows auf utf8 umstellen sollst. Ich weiß aber nicht, ob das nicht irgendwelche Seiteneffekte hat. dumpdata bietet auch andere Serialisierungsformate an, zum Beispiel xml und yaml, die man über den Parameter --format anfordern kann: https://docs.djangoproject.com/en/4.1/t ... on-formats Daher würde ich erst einmal das versuchen.

EDIT: Siehe auch (letzter Punkt): https://docs.djangoproject.com/en/4.1/h ... n-pitfalls
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

sparrow hat geschrieben: Samstag 4. März 2023, 19:27

Code: Alles auswählen

python -Xutf8 manage.py dumpdata core.sachaufgabe --indent 2 > sachaufgabe.json
... wäre schön gewesen:

Code: Alles auswählen

PS D:\Dropbox\RechentrainerWeb\rechentrainer_Kopie(1)> python -Xutf8 manage.py dumpdata core.sachaufgabe --indent 2 > sachaufgabe.json
PS D:\Dropbox\RechentrainerWeb\rechentrainer_Kopie(1)> python manage.py loaddata sachaufgabe.json
Traceback (most recent call last):
  File "D:\Dropbox\RechentrainerWeb\rechentrainer_Kopie(1)\manage.py", line 22, in <module>
    main()
 ...
    stream_or_string = stream_or_string.decode()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@Pitwheazle: Dann dem Hinweis von nezzcarth folgen und XML schreiben lassen. Da ist die Angabe der Kodierung Teil des Formats.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

nezzcarth hat geschrieben: Samstag 4. März 2023, 19:31 EDIT: Siehe auch (letzter Punkt): https://docs.djangoproject.com/en/4.1/h ... n-pitfalls
Ich habe den Hinweis mal ausprobiert und das hier umgestellt:
Bild
... das hat auch nicht geholfen. Jetzt rödelt der Computer aber beim einen und anderen - ich hoffe, da sind nicht grundlegende Dinge umgestellt.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Wie gesagt, mit xml als Austauschformat, statt jsonb, ergibt sich das Problem wahrscheinlich nicht. Das hatte nezzcarth ja schon geschrieben.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

sparrow hat geschrieben: Sonntag 5. März 2023, 06:45 Wie gesagt, mit xml als Austauschformat, statt jsonb, ergibt sich das Problem wahrscheinlich nicht. Das hatte nezzcarth ja schon geschrieben.
Doch, leider:
Bild
PS.: Nach meiner Windows UTF-8 Aktion, funktioniert einiges nicht mehr wie gewohnt. Windows wollte wieder mal dies und das einrichten und auch einige der Grundeinstellungen von VisualStudioCode sind weg. Auch nachdem ich das rückgängig gemacht habe - ich hoffe, da warten nicht noch größere Überraschungen.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Das ist json und kein XML.
Ich bin unterwegs und kann es nicht testen, aber nezzcarth hat oben geschrieben, dass es der Parameter --format ist. Gast du den verwendet?

Code: Alles auswählen

python manage.py dumpdata core.sachaufgabe --format xml > sachaufgabe.xml
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Pitwheazle hat geschrieben: Sonntag 5. März 2023, 12:48 PS.: Nach meiner Windows UTF-8 Aktion, funktioniert einiges nicht mehr wie gewohnt. Windows wollte wieder mal dies und das einrichten und auch einige der Grundeinstellungen von VisualStudioCode sind weg. Auch nachdem ich das rückgängig gemacht habe - ich hoffe, da warten nicht noch größere Überraschungen.
So etwas hatte ich befürchtet und daher auch darauf hingewiesen, dass man erst eine andere Lösung versuchen sollte. Der XML-Export funktioniert bei mir so, wie sparrow es beschrieben hat. Ansonsten wird auf der verlinkten Seite des Django-Teams ja noch die Umgebungsvariable PYTHONUTF8 erwähnt, die man ab Python 3.7 auf 1 setzen kann und die du in der Powershell setzen kannst. Da ich selbst kein Windowssystem greifbar habe, kann ich es selbst nicht ausprobieren.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Pitwheazle hat geschrieben: Sonntag 5. März 2023, 12:48 PS.: Nach meiner Windows UTF-8 Aktion, funktioniert einiges nicht mehr wie gewohnt. Windows wollte wieder mal dies und das einrichten und auch einige der Grundeinstellungen von VisualStudioCode sind weg. Auch nachdem ich das rückgängig gemacht habe - ich hoffe, da warten nicht noch größere Überraschungen.
Fazit: Nicht jeder Tipp aus dem Internet ist sinnvoll. ;)

Die systemweiten Sprach- und Kodierungseinstellungen legt man bei der Installation des Betriebssystems fest. Danach würde ich davon die Finger lassen. Solche Probleme löst man in aller Regel über Umgebungsvariablen, da man auch speziell für das Skript definieren kann, um es nicht systemweit machen zu müssen. Hattest du es schon mit PYTHONIOENCODING probiert?

Bitte beachte, dass bereits geschriebene Daten trotzdem "kaputt" sein können. Die müsstest du dann nochmal neu schreiben lassen mit den geänderten Einstellungen oder dich etwas eingehender mit den benötigten Konvertierungen via encode() / decode() beschäftigen. Und an der Stelle vielleicht noch der obligatorische Hinweis, dass beim direkten Zugriff via open() natürlich immer der ``encoding``-Parameter genutzt werden sollte, eben damit man sicher sein kann, in welcher Kodierung die Daten geschrieben wurde. Ebenso lassen sich die meisten Editoren bzw. Entwicklungsumgebungen in deren Einstellungen anweisen, immer UTF-8 zu verwenden.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

@ nezzcarth und @sparrow: Da bin ich auch wieder dran:
sparrow hat geschrieben: Sonntag 5. März 2023, 13:47 Das ist json und kein XML.
Ich bin unterwegs und kann es nicht testen, aber nezzcarth hat oben geschrieben, dass es der Parameter --format ist. Hast du den verwendet?

Code: Alles auswählen

python manage.py dumpdata core.sachaufgabe --format xml > sachaufgabe.xml
Das mag mein Entspricht Zeichen nicht:
PS C:\Dropbox\RechentrainerWeb\rechentrainer_Kopie(1)> python manage.py dumpdata core.sachaufgabe --format xml > sachaufgabe.xml
CommandError: Unable to serialize database: 'charmap' codec can't encode character '\u2259' in position 9: character maps to <undefined>
... muss ich doch händisch ersetzen?
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Langsam müsste ich meine Sachaufgben mal hochladen. Ich habe nochmals die obigen Vorschläge durchprobiert, der Fehler mit dem entspricht Zeichen wird nicht mehr angezeigt (es ist aber auch keines drin).

Code: Alles auswählen

python manage.py dumpdata core.sachaufgabe --format xml > sachaufgabe.xml
erzeugt:

Code: Alles auswählen

<?xml version="1.0" encoding="utf-8"?>
<django-objects version="1.0"><object model="core.sachaufgabe" pk="1"><field name="lfd_nr" type="SmallIntegerField">7</field><field name="ab_jg" type="SmallIntegerField">4</field><field name="text" type="TextField">{a[0]} hat {e}Ç gespart. {a[1]} m÷chte sich {d[0]} kaufen, {d[1]} {f}Ç kostet. Wie viel Geld fehlt {a[2]} noch?</field><field name="variable" type="JSONField">{"a": [["Julia", "Sie", "ihr"], ["Sophie", "Sie", "ihr"], ["Maria", "Sie", "ihr"], ["Paul", "Er", "ihm"]], "d": [["einen neuen Pullover", "der"], ["eine neue Tasche", "die"]], "e": [10, 15, 20], "f": [25, 28, 30]}</field><field name="loesung" type="CharField">{f}-{e}={}</field><field name="pro_text" type="CharField">Pulloverkauf:</field><field name="anmerkung" type="CharField"><None></None></field><field name="links_text" type="CharField">Es fehlen</field><field name="rechts_text" type="CharField">Ç</field></....

Code: Alles auswählen

python manage.py dumpdata core.sachaufgabe --indent 2 > sachaufgabe.json
erzeugt:

Code: Alles auswählen

[
{
  "model": "core.sachaufgabe",
  "pk": 1,
  "fields": {
    "lfd_nr": 7,
    "ab_jg": 4,
    "text": "{a[0]} hat {e}Ç gespart. {a[1]} m÷chte sich {d[0]} kaufen, {d[1]} {f}Ç kostet. Wie viel Geld fehlt {a[2]} noch?",
    "variable": {
      "a": [
        [
          "Julia",
          "Sie",
          "ihr"
        ],
        [
          "Sophie",
          "Sie",
          "ihr"
        ],
        [
          "Maria",
          "Sie",
          "ihr"
        ],
        [
          "Paul",
          "Er",
          "ihm"
        ]
      ],
      "d": [
        [
          "einen neuen Pullover",
          "der"
        ],
        [
          "eine neue Tasche",
          "die"
        ]
      ],
      "e": [
        10,
        15,
        20
      ],
      "f": [
        25,
        28,
        30
      ]
    },
    "loesung": "{f}-{e}={}",
    "pro_text": "Pulloverkauf:",
    "anmerkung": null,
    "links_text": "Es fehlen",
    "rechts_text": "Ç"
  }
},...
und

Code: Alles auswählen

python -Xutf8 manage.py dumpdata core.sachaufgabe --indent 2 > sachaufgabe.json
sieht so ähnlich aus (aber nicht genauso):

Code: Alles auswählen

[
{
  "model": "core.sachaufgabe",
  "pk": 1,
  "fields": {
    "lfd_nr": 7,
    "ab_jg": 4,
    "text": "{a[0]} hat {e}Ôé¼ gespart. {a[1]} m├Âchte sich {d[0]} kaufen, {d[1]} {f}Ôé¼ kostet. Wie viel Geld fehlt {a[2]} noch?",
    "variable": {
      "a": [
        [
          "Julia",
          "Sie",
          "ihr"
        ],
        [
          "Sophie",
          "Sie",
          "ihr"
        ],
        [
          "Maria",
          "Sie",
          "ihr"
        ],
        [
          "Paul",
          "Er",
          "ihm"
        ]
      ],
      "d": [
        [
          "einen neuen Pullover",
          "der"
        ],
        [
          "eine neue Tasche",
          "die"
        ]
      ],
      "e": [
        10,
        15,
        20
      ],
      "f": [
        25,
        28,
        30
      ]
    },
    "loesung": "{f}-{e}={}",
    "pro_text": "Pulloverkauf:",
    "anmerkung": null,
    "links_text": "Es fehlen",
    "rechts_text": "Ôé¼"
  }
},...
habt ihr noch eine andere Idee?
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Schick mir mal bitte .JSON Datei ohne sie vorher verändert zu haben per PM.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Welche, die erste oder die zweite?
Kann man per PN auch Dateianhänge verschicken oder muss ich das ganze in das Nachrichtenfeld kopieren?
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Ah, sorry, das geht hier mit den Anhängen gar nicht.
Ich schreibe dir eine PM.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@Pitwheazle: Deine sachaufgabe.json, die du mir geschickt hast, ist UTF-8 kodiert. Du benutzt nur einen Editor, der das anscheinend nicht erkennt.
Unter Windows lege ich dir da einmal notepad++ ans Herz.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Was mache ich verkehrt. Im Notepad++ sieht es bei mir so aus:
Bild
und
Bild
möglicherweise reden wir aneinander vorbei. Die Codierung konnte ich auch früher schon mit notepad++ umwandeln. Mein Problem sind die Umlaute usw. die ich alle händisch umwandeln muss.
Antworten