Bagaimana saya bisa menyandikan dan mendekodekan string persen-disandikan (URL disandikan) pada baris perintah?
Saya mencari solusi yang dapat melakukan ini:
$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük
command-line
conversion
text
encoding
url
ændrük
sumber
sumber
%E6ndr%FCk
tidak terlihat seperti (standar) UTF8 bagi saya. Atau hanya sebuah contoh?Jawaban:
Perintah-perintah ini melakukan apa yang Anda inginkan:
Jika Anda ingin menyandikan spasi sebagai
+
, gantiurllib.quote
denganurllib.quote_plus
.Saya kira Anda akan ingin alias mereka ;-)
sumber
kulit
Coba baris perintah berikut:
Anda dapat mendefinisikannya sebagai alias dan menambahkannya ke file rc shell Anda :
Lalu setiap kali Anda membutuhkannya, cukup ikuti:
pesta
Saat membuat skrip, Anda dapat menggunakan sintaks berikut:
Namun sintaks di atas tidak akan menangani plus (
+
) dengan benar, jadi Anda harus menggantinya dengan spasi viased
.Anda juga dapat menggunakan yang berikut ini
urlencode()
danurldecode()
fungsinya:bash + xxd
Fungsi Bash dengan
xxd
alat:Ditemukan di file inti cdown , juga di stackoverflow .
Python
Cobalah untuk menentukan alias berikut:
Pemakaian:
Sumber: ruslanspivak
PHP
Menggunakan PHP Anda dapat mencoba perintah berikut:
atau hanya:
Gunakan
-R
untuk input baris ganda.Perl
Di Perl Anda dapat menggunakan
URI::Escape
.Atau untuk memproses file:
sed
Penggunaan
sed
dapat dicapai dengan:awk
Coba solusi anon :
Lihat: Menggunakan awk printf untuk urldecode teks .
nama file decoding
Jika Anda perlu menghapus penyandian url dari nama file, gunakan
deurlname
alat darirenameutils
(misdeurlname *.*
.).Lihat juga:
Terkait:
sumber
%
, mungkin Anda bisa menggantinyaprintf "$c"
denganprintf "%c" "$c"
? Masalah lain adalah bahwa beberapa karakter non-ASCII tidak dikodekan (sepertiä
) dalam beberapa pengaturan bahasa, mungkin menambahkanexport LC_ALL=C
fungsi a (yang seharusnya tidak mempengaruhi apa pun di luar fungsi)?Persen-encode karakter URI dan non-ASCII karakter khusus
-s
(--slurp
) membaca baris input ke dalam array dan-s -R
(--slurp --raw-input
) membaca input ke dalam satu string.-r
(--raw-output
) menampilkan isi string bukannya string literal JSON.Persen-enkode semua karakter
tr -d \\n
menghapus umpan baris yang ditambahkanxxd -p
setelah setiap 60 karakter.Persen-sandi semua karakter kecuali karakter alfanumerik ASCII di Bash
Tanpa
-d ''
ini akan melewatkan baris baris dan byte nol. TanpaIFS=
ini akan menggantikan karakterIFS
dengan%00
. TanpaLC_ALL=C
ini misalnya akan digantiあ
dengan%3042
di lokal UTF-8.sumber
Solusi bash murni hanya untuk decoding :
sumber
Saya tidak dapat mengomentari jawaban terbaik di utas ini , jadi inilah milik saya.
Secara pribadi, saya menggunakan alias ini untuk penyandian dan penguraian URL:
Kedua perintah memungkinkan Anda untuk mengkonversi data, diteruskan sebagai argumen baris perintah atau membacanya dari input standar , karena keduanya satu-baris memeriksa apakah ada argumen baris perintah (bahkan yang kosong) dan memprosesnya atau hanya membaca input standar jika tidak.
perbarui 2015-07-16 (kosongkan 1 arg)
... menurut komentar @muru.
perbarui 2017-05-28 (penyandian slash)
Jika Anda juga perlu menyandikan slash, cukup tambahkan argumen kosong kedua ke fungsi kutipan, maka slash juga akan dikodekan.
Jadi, akhirnya
urlencode
alias dalam bash terlihat seperti ini:Contoh
sumber
sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1]
mungkin lebih tepat. Terutama jika Anda menggunakan ini dalam skrip dan tanpa sengaja memberikan argumen kosong pertama.len(sys.argv) < 2 and sys.stdin.read()[0:-1] or sys.argv[1]
Sekarang:sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1]
Yaitu, jika bahkan ada argumen pertama yang kosong, perintah tidak menunggu input dari input standar, tetapi memproses argumen kosong.Saya menemukan sebuah paket,,
renameutils
yang berisi utilitasdeurlname
yang dapat mengubah nama file yang berisi karakter "persen-disandikan".Sayangnya, ini tidak men-decode stdin atau opsi baris perintah, tetapi hanya mengganti nama file, jadi Anda harus membuat file dummy untuk mendapatkan decoding (nama file yang diganti nama), tetapi dengan beberapa bash scripting prosesnya dapat otomatis .
Tidak ada informasi tentang bagian penyandian, bahkan karena bisa dipertanyakan karakter mana yang disandikan. Hanya non-ASCII?
Saya pikir harus ada beberapa alat / metode yang lebih baik.
sumber
Mirip dengan Stefano ansqer tetapi dengan Python 3:
Untuk menyandikan juga garis miring:
Info lebih lanjut tentang perbedaannya di sini .
sumber
Berikut adalah fungsi POSIX Awk untuk penyandian:
Contoh
sumber