Fehlerhaftes Encoding bei Umlauten in JSON-Daten per WinHTTPRequest

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

Ahk_fan
Posts: 237
Joined: 31 Aug 2018, 14:34
Contact:

Fehlerhaftes Encoding bei Umlauten in JSON-Daten per WinHTTPRequest

15 Dec 2022, 10:19

Hallo,

ich habe das Prblem gehabt, dass eine WinHTTPRequest Abfrage auf eine REST-Schnittstelle ein JSON Daten als ResponseText zurückgab, die bei einem als UTF8, UTF8-BOM gepeicherten Script und AHK Unicode die Umlaute und ß bei Parsen per JSON.ahk falsch anzeigten.
2022-12-15 16_20_10-Window.png
2022-12-15 16_20_10-Window.png (36.05 KiB) Viewed 2304 times
Hier meine Lösung, die auf dem basierte https://www.autohotkey.com/board/topic/95321-how-to-convert-ansi-string-to-utf-8-ahk-l-unicode/

- ResponseText in File mit ANSI Encoding schreiben
- als UTF8-BOM lesen
- als return-Wert zurückgeben zur Weiterverarbeitung

Code: Select all

ansi2utf8File(str) {
	filename := ".utf8"
	
	FileOpen(filename, "w", "CP1252").Write(str)
	
	FileRead, str_utf8, % "*P65001 " filename
	FileDelete, %filename%
		
	return str_utf8
}
Beispieldatei: 1.txt mit Umlauten
1.txt
(7.48 KiB) Downloaded 149 times
Wer gute Verbesserungsvorschläge hat, immer her damit!
regards,
AHK_fan :)
https://hr-anwendungen.de
just me
Posts: 9466
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Fehlerhaftes Encoding bei Umlauten in JSON-Daten per WinHTTPRequest

15 Dec 2022, 11:01

Moin,

solange das RAM mitmacht, kannst Du das auch ohne Datei erledigen. Das sollte es tun:

Code: Select all

GetUTF8(ByRef Str) {
   VarSetCapacity(Tmp, StrPut(Str, "CP0"))
   StrPut(Str, &Tmp, "CP0")
   Return StrGet(&Tmp, "UTF-8")
}

Für Fans von AHK ANSI erledigt das auch ein einfaches StrGet() auf die Adresse der urspünglich per WinHTTPRequest gefüllten Variable.
Ahk_fan
Posts: 237
Joined: 31 Aug 2018, 14:34
Contact:

Re: Fehlerhaftes Encoding bei Umlauten in JSON-Daten per WinHTTPRequest

15 Dec 2022, 15:15

hmm... ganau das hatte ich auch probiert, aber mir liefert der return immer einen leeren string.
Hab da mit unterschiedlichen codepages herumgespielt, das hatte aber keine Effekt. Ich kann leider hier nicht den HTTPRequest posten, weil die tenantId und secret ja dann alle hätten, das wäre sehr sehr schlecht :-D

so sah meine Function aus, die ich irgendwoher schon in etwas anderer Form hatte:

Code: Select all

FixUtf8(ByRef input) {
	VarSetCapacity(tempVar := "", StrPut(input, "CP65001"))
	StrPut(strText, &tempVar, "CP65001")
	Return StrGet(&tempVar, "UTF-8")
}
regards,
AHK_fan :)
https://hr-anwendungen.de
just me
Posts: 9466
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Fehlerhaftes Encoding bei Umlauten in JSON-Daten per WinHTTPRequest

16 Dec 2022, 03:48

Moin,

Code: Select all

	StrPut(strText, &tempVar, "CP65001")
Falls das kein Copy&Paste Fehler ist, musst Du wohl strText durch input ersetzen.

Der Fehler entsteht, weil der HTTPRequest UTF-8 liefert, AHK bei der Übernahme aber von ANSI ausgeht. Die UTF-8 Kodierung wird deshalb unverändert als ANSI Zeichen übernommen. Diesen Irrtum musst Du rückgängig machen. Dazu musst Du den AHK String zunächst einmal wieder per StrPut() in das 'falschverstandene' Ursprungsformat ANSI zurückverwandeln. Dann kannst Du per StrGet() bestimmen, dass das tatsächlich UTF-8 ist.

Code: Select all

FixUtf8(ByRef input) {
	VarSetCapacity(tempVar, StrPut(input, "CP0")) ; <<<< nach ANSI konvertieren
	StrPut(input, &tempVar, "CP0") ; <<<< nach ANSI konvertieren
	Return StrGet(&tempVar, "UTF-8")
}
just me
Posts: 9466
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Fehlerhaftes Encoding bei Umlauten in JSON-Daten per WinHTTPRequest

16 Dec 2022, 04:06

Noch eine Idee:

Ich kann es jetzt nicht ausprobieren, aber vielleicht kannst Du mal testen, ob es reicht, für das HTTPRequest Objekt einen Header mit dem Zeichensatz zu setzen:

Code: Select all

oHTTP.SetRequestHeader("Content-Type", "text/plain;charset=UTF-8")
Ahk_fan
Posts: 237
Joined: 31 Aug 2018, 14:34
Contact:

Re: Fehlerhaftes Encoding bei Umlauten in JSON-Daten per WinHTTPRequest

16 Dec 2022, 08:39

Hi, vielen Dank für die Vorschläge:

das input war ein Kopierfehler für das Forum...

das mit dem "charset=UTF-8" habe ich auch bereits getestet, funktioniert leider nicht. folgendes habe ich probiert:

text/plain
application/json; charset=utf-8
application/x-www-form-urlencoded
in verschiedenen Kombinationen beim encoding, ohne Erfolg
regards,
AHK_fan :)
https://hr-anwendungen.de

Return to “Skripte und Funktionen”

Who is online

Users browsing this forum: No registered users and 46 guests