web-dev-qa-db-ja.com

パーセントエンコードされたすべてのUTF-8部分文字列をプレーンなUTF-8テキストに置き換える方法は?

URLに%エンコードされたUTF-8テキストがたくさん含まれているhtmlファイルがあります。

たとえば、「%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B」は「ресурсы」(ロシア語で「resources」)を表します。

タスクは、そのようなすべての部分文字列を読み取り可能なUTF-8テキストに置き換えることです。

タスクを単純化するために、ファイルには他の%記号の使用法はないと見なすことができます。文字の数字は大文字と小文字の両方にすることができます。

これはsedPerlawkなどでエレガントに実行できると思いますが、方法がわかりません。

このWebアプリケーション そこに貼り付けたテキストでうまくいくようです。

9
Ivan

Bash、zsh、GNU echo、または一部のシステムでのkshの実装では、すべてのecho -e%に置き換えた後、\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: ресурсы

(文字列自体に円記号が含まれておらず、echoコマンドでサポートされているオプションの1つではないことを前提としています)

@JoshLeeも指摘しているように、「エコーの警告」は、以下を直接使用することで回避できます。

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

代わりに、最初のコマンドのすぐ後ろにあります。

9
LiuYan 刘研

Perlの場合:

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

またはURI::Escape

Perl -MURI::Escape -pe '$_=uri_unescape$_'
5

あなたを助けることができるconvmvと呼ばれるプログラムがあります。

convmv --unescape /some_path/target_fileを使用するだけです。ドライランを行います。

確認したら、convmv --notest --unescape /some_path/target_fileを使用して続行します。

このプログラムのホームページは次のとおりです。 http://j3e.de/linux/convmv/

0
Star Brilliant