Yüzde kodlamalı tüm UTF-8 alt dizelerini düz UTF-8 metni ile nasıl değiştirebilirim?


9

URL'lerde% -encoded UTF-8 metni içeren bir html dosyası var.

Örneğin "% D1% 80% D0% B5% D1% 81% D1% 83% D1% 80% D1% 81% D1% 8B" "ресурсы" (Rusça "kaynaklar") anlamına gelir.

Görev, tüm bu alt dizeleri okunabilir UTF-8 metni ile değiştirmektir.

Görevi basitleştirmek %için dosyada başka bir işaret kullanımı olmadığını düşünebiliriz . Harf rakamları hem büyük hem de küçük harf olabilir.

Ben bu konuda zarif yapılabilir şüpheli sed, perl, awkya da bir şey ama nasıl olduğunu bilmiyorum.

Bu web uygulaması , oraya yapıştırdığınız metinle hile yapıyor gibi görünüyor.

Yanıtlar:


9

Bash, zsh, GNU yankı veya bazı sistemlerde ksh bazı uygulamalarda ile bu basitçe deşifre edilebilir echo -etüm değiştirdikten sonra %birlikte \x.

url_encoded_string="%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B"
temp_string=${url_encoded_string//%/\\x}

printf '%s\n' "$temp_string"
# output: \xD1\x80\xD0\xB5\xD1\x81\xD1\x83\xD1\x80\xD1\x81\xD1\x8B

echo -e "$temp_string"
# output: ресурсы

(Dizenin kendisinin ters eğik çizgi karakterleri içermediğini ve echokomutunuz tarafından desteklenen seçeneklerden biri olmadığını varsayar )

@JoshLee'nin de işaret ettiği gibi, "yankı uyarısı" doğrudan aşağıdakiler kullanılarak önlenebilir:

printf ${url_encoded_string//%/\\x}

bunun yerine doğrudan ilk komutun arkasında.


Bu zarif çözüm çalışacağını Not herhangi . Kodlama, sadece UTF-8 (yani ~ ve diğerleri için kodlamaların kurtulmak bir püf benim alet eklemek için teşekkürler.!
vonbrand

5

Perl ile:

perl -pe 's/%([0-9A-F]{2})/pack"H2",$1/gei'

Veya URI::Escape:

perl -MURI::Escape -pe '$_=uri_unescape$_'


@Nemo, $_burada perl'ın $_değil, bash' s. Bu -pseçenekle birlikte, her girdi kaydı için perl ifadesi çalıştırılır (bağımsız değişken olarak verilen dosyalardan okunan kayıtlar veya bağımsız değişken sağlanmamışsa stdin), geçerli kayıt saklanır $_. Yani benzeyen awk'ın $0.
Stéphane Chazelas

0

Size convmvyardımcı olabilecek bir program var.

Sadece kullanın convmv --unescape /some_path/target_file. Kuru çalışma yapacak.

Onayladıktan sonra convmv --notest --unescape /some_path/target_filedevam etmek için kullanın .

Bu programın ana sayfası: http://j3e.de/linux/convmv/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.