Como substituir todas as substrings UTF-8 com codificação percentual por texto simples UTF-8?

9

Eu tenho um arquivo html com muito texto codificado em% UTF-8 em URLs.

Por exemplo, "% D1% 80% D0% B5% D1% 81% D1% 83% D1% 80% D1% 81% D1% 8B" significa "ресурсы" ("recursos" em russo).

A tarefa é substituir todas essas substrings por textos legíveis em UTF-8.

Para simplificar a tarefa, podemos considerar que não há outro uso do sinal % no arquivo. Os dígitos das letras podem ser maiúsculas e minúsculas.

Eu suspeito que isso pode ser feito de forma elegante com sed , perl , awk ou algo assim, mas não sei como.

Este aplicativo da Web parece funcionar com o texto que você cola lá.

    
por Ivan 04.12.2012 / 07:12

3 respostas

9

Com bash, zsh, GNU echo ou algumas implementações de ksh em alguns sistemas, isso pode ser decodificado simplesmente por echo -e após a substituição de todos os % por \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: ресурсы

(Assume-se que a string em si não contém caracteres de barra invertida e não é uma das opções suportadas pelo seu comando echo )

Como @JoshLee também aponta, a "ressalva de eco" pode ser evitada usando diretamente:

printf ${url_encoded_string//%/\x}

diretamente atrás do primeiro comando.

    
por 04.12.2012 / 07:36
5

Com perl:

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

Ou com URI::Escape :

perl -MURI::Escape -pe '$_=uri_unescape$_'
    
por 04.12.2012 / 08:01
0

Existe um programa chamado convmv que pode ajudá-lo.

Use simplesmente convmv --unescape /some_path/target_file . Vai fazer um dry-run.

Depois de confirmar, use convmv --notest --unescape /some_path/target_file para continuar.

A página inicial deste programa é: link

    
por 12.01.2014 / 04:19