すべてのパーセントエンコードされたUTF-8サブストリングをプレーンUTF-8テキストに置き換える方法は?


9

URLに多くの%エンコードされたUTF-8テキストを含むhtmlファイルを持っています。

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

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

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

私はこれがでエレガントに行うことができます疑いがあるsedperlawkまたは何かが、方法がわかりません。

このWebアプリケーションは、そこに貼り付けたテキストでトリックを行うようです。

回答:


9

一部のシステムでは、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}

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


このエレガントなソリューションは、UTF-8だけでなく、どのエンコーディングでも機能することに注意してください(つまり、〜やその他のエンコーディングを
削除し

5

perlの場合:

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

またはURI::Escape

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


@Nemo、$_ここにあるperlのは$_、ないbashの。-pオプションと組み合わせて、perl式はすべての入力レコード(引数として指定されたファイルまたは引数が指定されていない場合はstdinとして読み取られるレコード)に対して実行され、現在のレコードはに格納され$_ます。それは次のようにですawk$0
ステファンChazelas

0

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

単に使用しますconvmv --unescape /some_path/target_file。予行演習を行います。

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

このプログラムのホームページは、http//j3e.de/linux/convmv/です。

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