I am trying to get some data from a Wikipedia page. I use this URL to get the data:
https://el.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=δίας
You can open the URL with your browser to see how it looks.
My problem is that the data is encoded and I don't know how to decode them from my android app.
What I have tried so far:
URLDecoder.decode(articleText, "utf-8");
and
byte [] barr = Base64.getDecoder().decode(articleText);
Print.e("Decoded value is " new String(barr));
and
byte [] barr = Base64.getMimeDecoder().decode(articleText);
Print.e("Decoded value is " new String(barr));
All failed. The first one didn't change anything.
The second crashes with log:
java.lang.IllegalArgumentException: Illegal base64 character 5c
The third crashes with log:
java.lang.IllegalArgumentException: Last unit does not have enough valid bits
Please note that I only try to decode the encoded text and not all the JSON text.
Any ideas?
CodePudding user response:
That's just a JSON response, even though using escape sequences in a JSON response like this is unusual.
You don't need to decode anything. Any character in a JSON string value can be replaced by a Unicode escape sequence. Parsing the JSON string will return the actual characters.
Those escape sequences are valid in Python too.
print('\u0394\u03af\u03b1\u03c2 \u03a7\u03b1\u03ca\u03b4\u03b1\u03c1\u03af\u03bf\u03c5 - \u03b1\u03b8\u03bb\u03b7\u03c4\u03b9\u03ba\u03cc\u03c2 ')
>>> 'Δίας Χαϊδαρίου - αθλητικός '
This:
import requests
url="https://el.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=δίας"
source = requests.get(url).json()
print(source)
Produces
{'batchcomplete': '', 'query': {'normalized': [{'from': 'δίας', 'to': 'Δίας'}], 'pages': {'18786': {'pageid': 18786, 'ns': 0, 'title': 'Δίας', 'extract': 'Το όνομα Δίας μπορεί να αναφέρεται στα παρακάτω:\n\nΜυθολογίαΟ Δίας (μυθολογία) - πατέρας των θεών της ελληνικής μυθολογίας.ΑστρονομίαΟ Δίας (πλανήτης) - ο μεγαλύτερος πλανήτης του ηλιακού συστήματος.\nΔίας LI - φυσικός δορυφόρος του πλανήτη Δία.\nΔίας LII - φυσικός δορυφόρος του πλανήτη Δία.\nΚαυτός Δίας - ονομασία κατηγορίας εξωηλιακών πλανητών.ΤέχνηΔίας του Οτρίκολι - μνημειώδης προτομή του ομωνύμου αρχαίου θεού.\nΔίας και Γανυμήδης - γλυπτό που εκτίθεται στο Αρχαιολογικό Μουσείο Ολυμπίας.\nΔίας και Θέτις - πίνακας του Γάλλου ζωγράφου Ζαν Ωγκύστ Ντομινίκ Ενγκρ.ΑθλητισμόςΑ.Σ. Δίας Πατρών - αθλητικός σύλλογος μπέιζμπολ\nΠ.Σ. Δίας Δίου - ποδοσφαιρικός σύλλογος\nΑ.Ο. Δίας Κορυδαλλού - αθλητικός όμιλος\nΑ.Ο. Δίας Σαραβαλίου - αθλητικός όμιλος\nΑ.Σ. Δίας Κωστακιών - αθλητικός σύλλογος\nΑ.Ο. Δίας Ηρακλείου - αθλητικός όμιλος\nΠ.Α.Σ. Δίας Αγίου Δημητρίου - πολιτιστικός αθλητικός σύλλογος\nΠ.Α.Σ. Δίας Κασσιώπης - ποδοσφαιρικός αθλητικός σύλλογος\nΑ.Ο. Δίας Ολυμπιακού Χωριού - αθλητικός όμιλος\nΑ.Σ. Δίας Χαϊδαρίου - αθλητικός σύλλογος\nΑ.Ο. Δίας Αχαρνών - αθλητικός όμιλος'}}}}
And
source['query']['pages']['18786']['extract']
Prints
'Το όνομα Δίας μπορεί να αναφέρεται στα παρακάτω:\n\nΜυθολογίαΟ Δίας (μυθολογία) - πατέρας των θεών της ελληνικής μυθολογίας.ΑστρονομίαΟ Δίας (πλανήτης) - ο μεγαλύτερος πλανήτης του ηλιακού συστήματος.\nΔίας LI - φυσικός δορυφόρος του πλανήτη Δία.\nΔίας LII - φυσικός δορυφόρος του πλανήτη Δία.\nΚαυτός Δίας - ονομασία κατηγορίας εξωηλιακών πλανητών.ΤέχνηΔίας του Οτρίκολι - μνημειώδης προτομή του ομωνύμου αρχαίου θεού.\nΔίας και Γανυμήδης - γλυπτό που εκτίθεται στο Αρχαιολογικό Μουσείο Ολυμπίας.\nΔίας και Θέτις - πίνακας του Γάλλου ζωγράφου Ζαν Ωγκύστ Ντομινίκ Ενγκρ.ΑθλητισμόςΑ.Σ. Δίας Πατρών - αθλητικός σύλλογος μπέιζμπολ\nΠ.Σ. Δίας Δίου - ποδοσφαιρικός σύλλογος\nΑ.Ο. Δίας Κορυδαλλού - αθλητικός όμιλος\nΑ.Ο. Δίας Σαραβαλίου - αθλητικός όμιλος\nΑ.Σ. Δίας Κωστακιών - αθλητικός σύλλογος\nΑ.Ο. Δίας Ηρακλείου - αθλητικός όμιλος\nΠ.Α.Σ. Δίας Αγίου Δημητρίου - πολιτιστικός αθλητικός σύλλογος\nΠ.Α.Σ. Δίας Κασσιώπης - ποδοσφαιρικός αθλητικός σύλλογος\nΑ.Ο. Δίας Ολυμπιακού Χωριού - αθλητικός όμιλος\nΑ.Σ. Δίας Χαϊδαρίου - αθλητικός σύλλογος\nΑ.Ο. Δίας Αχαρνών - αθλητικός όμιλος'
Notice that I used the original Greek parameter values in the URL string. Python 3 strings are Unicode, so there's no need to escape non-English text.
This is unusual
Using escape sequences for all characters is unusual. The HTTP response contains Content-Type: application/json; charset=utf-8
which clearly says the content is UTF8 characters. There's no need to escape them at all.
source = requests.get(url)
print(source.encoding)
>>> 'utf-8'
The API's JSON parameters offer a way to receive the text without encoding, by adding the utf8=true
parameter. This URL (https://el.wikipedia.org/w/api.php?format=json&utf8=true&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=δίας
) returns the strings unescaped.
Using
url="https://el.wikipedia.org/w/api.php?format=json&utf8=true&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=δίας"
source = requests.get(url)
print(source.text)
Shows that the response text is no longer escaped:
{"batchcomplete":"","query":{"normalized":[{"from":"δίας","to":"Δίας"}],"pages":{"18786":{"pageid":18786,"ns":0,"title":"Δίας","extract":"Το όνομα Δίας μπορεί να αναφέρεται στα παρακάτω:\n\nΜυθολογίαΟ Δίας (μυθολογία) - πατέρας των θεών της ελληνικής μυθολογίας.ΑστρονομίαΟ Δίας (πλανήτης) - ο μεγαλύτερος πλανήτης του ηλιακού συστήματος.\nΔίας LI - φυσικός δορυφόρος του πλανήτη Δία.\nΔίας LII - φυσικός δορυφόρος του πλανήτη Δία.\nΚαυτός Δίας - ονομασία κατηγορίας εξωηλιακών πλανητών.ΤέχνηΔίας του Οτρίκολι - μνημειώδης προτομή του ομωνύμου αρχαίου θεού.\nΔίας και Γανυμήδης - γλυπτό που εκτίθεται στο Αρχαιολογικό Μουσείο Ολυμπίας.\nΔίας και Θέτις - πίνακας του Γάλλου ζωγράφου Ζαν Ωγκύστ Ντομινίκ Ενγκρ.ΑθλητισμόςΑ.Σ. Δίας Πατρών - αθλητικός σύλλογος μπέιζμπολ\nΠ.Σ. Δίας Δίου - ποδοσφαιρικός σύλλογος\nΑ.Ο. Δίας Κορυδαλλού - αθλητικός όμιλος\nΑ.Ο. Δίας Σαραβαλίου - αθλητικός όμιλος\nΑ.Σ. Δίας Κωστακιών - αθλητικός σύλλογος\nΑ.Ο. Δίας Ηρακλείου - αθλητικός όμιλος\nΠ.Α.Σ. Δίας Αγίου Δημητρίου - πολιτιστικός αθλητικός σύλλογος\nΠ.Α.Σ. Δίας Κασσιώπης - ποδοσφαιρικός αθλητικός σύλλογος\nΑ.Ο. Δίας Ολυμπιακού Χωριού - αθλητικός όμιλος\nΑ.Σ. Δίας Χαϊδαρίου - αθλητικός σύλλογος\nΑ.Ο. Δίας Αχαρνών - αθλητικός όμιλος"}}}}