Page 1 of 1

Fehlerhaftes Encoding bei Umlauten in JSON-Daten per WinHTTPRequest

Posted: 15 Dec 2022, 10:19
by Ahk_fan
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 2441 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 162 times
Wer gute Verbesserungsvorschläge hat, immer her damit!

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

Posted: 15 Dec 2022, 11:01
by just me
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.

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

Posted: 15 Dec 2022, 15:15
by Ahk_fan
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")
}

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

Posted: 16 Dec 2022, 03:48
by just me
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")
}

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

Posted: 16 Dec 2022, 04:06
by just me
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")

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

Posted: 16 Dec 2022, 08:39
by Ahk_fan
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