コマンドラインでパーセントエンコードされた文字列をエンコードおよびデコードするにはどうすればよいですか?


31

コマンドラインでパーセントエンコード(URLエンコード)文字列をエンコードおよびデコードするにはどうすればよいですか?

私はこれを行うことができるソリューションを探しています:

$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük

別のエンコーディングも組み込みたいですか?%E6ndr%FCk私には(標準)UTF8のように見えません。それとも単なる例ですか?
手配

@arrangeそれをキャッチしてくれてありがとう。どうやら、オンラインコンバーターの検索結果から悪いリンゴを選んだようです。
アーンドリューク

ファイル名については、「ファイル名のURIエンコーディングを削除する方法」を参照してください。
ケノーブ

回答:


35

これらのコマンドはあなたが望むことをします:

python -c "import urllib, sys; print urllib.quote(sys.argv[1])" æ
python -c "import urllib, sys; print urllib.unquote(sys.argv[1])" %C3%A6

あなたのようにスペースをエンコードしたい場合は+、交換してくださいurllib.quoteurllib.quote_plus

私はあなたがそれらエイリアスしたいと思うと思う;-)


1
最初の行の最後にあるæ文字は何ですか?編集:自分自身に答える-それを得た、それは単なる目的のエンコードされた文字列のUTF8文字列です:
TMG

1
python3はどうですか?
リカルド

@RicardoEはこの回答を確認します
パブロA

27

シェル

次のコマンドラインを試してください:

$ echo "%C3%A6ndr%C3%BCk" | sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"
ændrük

エイリアスとして定義し、シェルのrcファイルに追加できます。

$ alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'

次に、必要なときはいつでも、次のようにします。

$ echo "http%3A%2F%2Fwww" | urldecode
http://www

バッシュ

スクリプトを作成するときは、次の構文を使用できます。

input="http%3A%2F%2Fwww"
decoded=$(printf '%b' "${input//%/\\x}")

ただし、上記の構文はプラス(+)を正しく処理しないため、を介してスペースに置き換える必要がありますsed

次の関数urlencode()urldecode()関数も使用できます。

urlencode() {
    # urlencode <string>
    local length="${#1}"
    for (( i = 0; i < length; i++ )); do
        local c="${1:i:1}"
        case $c in
            [a-zA-Z0-9.~_-]) printf "$c" ;;
            *) printf '%%%02X' "'$c"
        esac
    done
}

urldecode() {
    # urldecode <string>

    local url_encoded="${1//+/ }"
    printf '%b' "${url_encoded//%/\\x}"
}

urldecode()は、データにバックスラッシュが含まれないと想定していることに注意してください。


bash + xxd

xxdツールを使用したBash関数:

urlencode() {
  local length="${#1}"
  for (( i = 0; i < length; i++ )); do
    local c="${1:i:1}"
    case $c in
      [a-zA-Z0-9.~_-]) printf "$c" ;;
    *) printf "$c" | xxd -p -c1 | while read x;do printf "%%%s" "$x";done
  esac
done
}

で発見cdownの要旨ファイルもで、stackoverflowの


Python

次のエイリアスを定義してください。

alias urldecode='python -c "import sys, urllib as ul; print ul.unquote_plus(sys.argv[1])"'
alias urlencode='python -c "import sys, urllib as ul; print ul.quote_plus(sys.argv[1])"'

使用法:

$ urlencode "ændrük"
C%26ndrC%3Ck
$ urldecode "%C3%A6ndr%C3%BCk"
ændrük

ソース:ruslanspivak


PHP

PHPを使用すると、次のコマンドを試すことができます。

$ echo oil+and+gas | php -r 'echo urldecode(fgets(STDIN));' // Or: php://stdin
oil and gas

あるいは単に:

php -r 'echo urldecode("oil+and+gas");'

-R複数行入力に使用します。


Perl

Perlでは、を使用できますURI::Escape

decoded_url=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0])' "$encoded_url")

または、ファイルを処理するには:

perl -i -MURI::Escape -e 'print uri_unescape($ARGV[0])' file

sed

使用sedは次の方法で実現できます。

cat file | sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' | xargs echo -e

awk

anonソリューションを試してください:

awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..

参照:awk printfを使用してテキストをurldecodeする


ファイル名のデコード

ファイル名からURLエンコーディングを削除する必要がある場合は、deurlnameツールrenameutils(たとえばdeurlname *.*)を使用します。

こちらもご覧ください:


関連:


bashの+ XXDバージョンが含まれている文字列では動作しません%、多分あなたは置き換えることができprintf "$c"printf "%c" "$c"?他の問題は、一部の非ASCII文字がä一部の言語設定でエンコードされていない(など)export LC_ALL=C、関数に追加される可能性があることです(関数以外には影響しないはずです)?
12431234123412341234123

8

予約済みのURI文字および非ASCII文字のパーセントエンコード

jq -s -R -r @uri

-s--slurp)入力行を配列に読み取り、-s -R--slurp --raw-input)入力を単一の文字列に読み取ります。-r--raw-output)JSON文字列リテラルの代わりに文字列の内容を出力します。

すべての文字をパーセントエンコードする

xxd -p|tr -d \\n|sed 's/../%&/g'

tr -d \\nxxd -p60文字ごとに追加される改行を削除します。

BashのASCII英数字を除くすべての文字のパーセントエンコード

eu () {
    local LC_ALL=C c
    while IFS= read -r -n1 -d '' c
    do 
        if [[ $c = [[:alnum:]] ]]
        then 
            printf %s "$c"
        else
            printf %%%02x "'$c"
        fi
    done
}

なければ-d ''、この改行とヌルのバイトをスキップします。なしIFS=これは中の文字を置き換えますIFS%00LC_ALL=Cこれがないと、たとえばUTF-8ロケールで置き換えられ%3042ます。


5

デコード専用の純粋なbashソリューション:

$ a='%C3%A6ndr%C3%BCk'
$ echo -e "${a//%/\\x}"
ændrük

4

このスレッドベストアンサーについてコメントすることはできません。

個人的には、URLのエンコードとデコードにこれらのエイリアスを使用します。

alias urlencode='python -c "import urllib, sys; print urllib.quote(  sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])"'

alias urldecode='python -c "import urllib, sys; print urllib.unquote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])"'

どちらのコマンドでも、データを変換し、コマンドライン引数として渡すか、標準入力から読み取ることができます。これは、両方のワンライナーがコマンドライン引数(空の引数も)があるかどうかをチェックして処理するか、そうでなければ標準入力を読み取るためです。

更新2015-07-16(空の1番目の引数)

... @muruコメントによると。

2017-05-28の更新(エンコードのスラッシュ)

スラッシュもエンコードする必要がある場合は、引用関数に空の2番目の引数を追加するだけで、スラッシュもエンコードされます。

したがって、最後にbashのurlencode エイリアスは次のようになります。

alias urlencode='python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")"'

$ urlencode "Проба пера/Pen test"
%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test

$ echo "Проба пера/Pen test" | urlencode
%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test

$ urldecode %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test
Проба пера/Pen test

$ echo "%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test" | urldecode
Проба пера/Pen test

$ urlencode "Проба пера/Pen test" | urldecode
Проба пера/Pen test

$ echo "Проба пера/Pen test" | urlencode | urldecode
Проба пера/Pen test

1
sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1]もっと適切だと思います。特にスクリプトでこれを使用し、誤って空の最初の引数を指定した場合。
ムル

@muruのコメントに従って、コマンドラインの引数のチェックを変更しました。次の len(sys.argv) < 2 and sys.stdin.read()[0:-1] or sys.argv[1] とおりです。 sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1] つまり、最初の引数が空であっても、コマンドは標準入力からの入力を待たずに、空の引数を処理します。
DIG mbl

2

「パーセントエンコード」文字を含むファイルの名前を変更できるrenameutilsユーティリティを含むパッケージを見つけましたdeurlname

残念ながら、stdinやコマンドラインオプションをデコードせず、ファイルの名前を変更するだけなので、デコード(名前を変更したファイルの名前)を取得するためにダミーファイルを作成する必要がありますが、bashスクリプトを使用するとプロセスを自動化できます。

どの文字をエンコードするか疑問がある場合でも、エンコード部分に関する情報はありません。非ASCIIのみ?

もっと良いツール/方法があるはずです。


1

Stefano ansqerに似ていますが、Python 3の場合:

python -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1]))" æ
python -c "import urllib.parse, sys; print(urllib.parse.unquote(sys.argv[1]))" %C3%A6

スラッシュもエンコードするには:

python -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\"))"

違いについての詳細はこちら


0

エンコード用のPOSIX Awk関数を次に示します。

function encodeURIComponent(str, j, q) {
  while (y++ < 125) z[sprintf("%c", y)] = y
  while (y = substr(str, ++j, 1))
    q = y ~ /[[:alnum:]_.!~*\47()-]/ ? q y : q sprintf("%%%02X", z[y])
  return q
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.