URI-Prozentkodierung von Zeichen (UTF-8)

Ich möchte bestimmte Zeichen (mit UTF-8) prozentual codieren , damit sie in URIs verwendet werden können.

So etwas wie die Web-App http://meyerweb.com/eric/tools/dencoder/ , aber als FLOSS und als Lösung für GNU/Linux . Ein Befehlszeilentool wird bevorzugt.

Bonus 1: Decodierung von prozentcodierten Zeichen zulassen.

Bonus 2: Bei der Eingabe einer URI nur die Zeichen prozentual codieren, die an ihrer jeweiligen Position nicht unverschlüsselt erlaubt sind. (Zum Beispiel muss der erste #unverschlüsselt bleiben, während alle anderen #als verschlüsselt werden müssen %23.)

Verwandte Frage zu SO: 'URLEncode from a bash script'

Antworten (1)

Wie auf askubuntu beantwortet, könnten Sie Python-Code ausführen.

# To encode:
python -c "import urllib, sys; print urllib.quote(sys.argv[1])" "String to encode"
# To decode:
python -c "import urllib, sys; print urllib.unquote(sys.argv[1])" "String%20to%20encode"

# Or if you have Python 3.x installed you could use these:
python3 -c "from urllib.parse import quote, sys; print(quote(sys.argv[1]))" "String to encode"
python3 -c "from urllib.parse import unquote, sys; print(unquote(sys.argv[1]))" "String%20to%20encode"

Was den Bonus 2 anbelangt, ist es nicht erforderlich, irgendetwas in der Fragmentkennung in Prozent zu codieren, aber wenn Sie diese auch codieren möchten, können Sie das obige verwenden und die Ausgabe an diesen sed-Befehl weiterleiten:

sed 's/%23/#/' # Replace the first percentage-encoded hashtag with a hashtag

Hinweis: Die obigen Befehle codieren die gesamte URL in Prozentcodierung, also denken Sie daran, dass das Einschließen des Protokolls den Doppelpunkt und möglicherweise das Fragezeichen codiert, um den Anfang der Abfragezeichenfolge zu markieren. Die Befehle waren immer nur dazu gedacht, Abfragezeichenfolgen und Pfadnamen in URLs prozentual zu codieren. Sie könnten diese Probleme umgehen, indem Sie den obigen Befehl sed verwenden, um die unerwünschten prozentual codierten Zeichen zu ersetzen.

Wenn Sie dies als einen einzigen Befehl mit der zu codierenden/decodierenden Zeichenfolge ausführen möchten, nehme ich an, dass bereits etwas da draußen ist. Wenn nicht, könnten Sie diesen Python-Code nehmen und ihn in ein Python-Programm oder Bash-Skript einfügen.

Danke Whitehooder, das erfüllt die Kernanforderung und den ersten Bonus. (Zum zweiten Bonus: Die #in the fragment-Komponente war nur ein Beispiel; ich interessiere mich für alle Komponenten, Path, Query, Fragment, die alle unterschiedliche Regeln für Zeichen haben, die unverschlüsselt erlaubt sind. Aber da es nur ein Bonus ist, ist es nicht wichtig für mich.)