सादे UTF-8 टेक्स्ट के साथ सभी प्रतिशत-एन्कोडेड UTF-8 सबस्ट्रिंग्स को कैसे बदलें?


9

मुझे URL में बहुत सारे% -encoded UTF-8 टेक्स्ट के साथ एक html फ़ाइल मिली है।

उदाहरण के लिए "% D1% 80% D0% B5% D1% 81% D1% 83% D1% 80% D1% 81% D1% 8B" रूसी में "ресурсы" ("संसाधन") के लिए खड़ा है।

कार्य ऐसे सभी सब्सट्रिंग को पठनीय UTF-8 टेक्स्ट के साथ बदलना है।

कार्य को सरल बनाने के लिए हम विचार कर सकते हैं %कि फ़ाइल में कोई अन्य साइन उपयोग नहीं है । अक्षर अंक ऊपरी और निचले दोनों मामले हो सकते हैं।

मैं इस के साथ सुंदर ढंग से किया जा सकता है पर शक sed, perl, awkया कुछ और लेकिन पता नहीं कैसे।

यह वेब एप्लिकेशन आपके द्वारा वहां पेस्ट किए गए पाठ के साथ चाल करने के लिए लगता है।

जवाबों:


9

बैश, zsh, GNU इको या कुछ सिस्टम पर 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आदेश द्वारा समर्थित विकल्पों में से एक नहीं है )

जैसा कि @ जोशी बताते हैं, "इको कैविट" को सीधे इस्तेमाल से बचा जा सकता है:

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

इसके बजाय सीधे पहले आदेश के पीछे।


ध्यान दें कि यह सुरुचिपूर्ण समाधान किसी भी एन्कोडिंग के साथ काम करेगा , न कि केवल यूटीएफ -8 (यानी, ~ और अन्य से एन्कोडिंग से छुटकारा पाएं। मेरे टूलबॉक्स में जोड़ने के लिए एक और चाल। धन्यवाद!
vonbrand

5

पर्ल के साथ:

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

या साथ URI::Escape:

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

मुझे यह पसंद है क्योंकि मैं इसे $_ gnu.org/software/bash/manual/html_node/Special-Parameters.html
नेमो

@ नीमो, $_यहाँ perl's $_नहीं है bash-pविकल्प के साथ संयोजन में , प्रति इनपुट अभिव्यक्ति को प्रत्येक इनपुट रिकॉर्ड के लिए चलाया जाता है (वर्तमान में दी गई फाइलों के रिकॉर्ड को तर्क या स्टड के रूप में पढ़ा जाता है यदि कोई तर्क प्रदान नहीं किया गया है), जिसमें वर्तमान रिकॉर्ड संग्रहीत है $_। यही कारण है कि के समान है awkकी $0
स्टीफन चेज़लस

0

एक कार्यक्रम कहा जाता है convmvजो आपकी मदद कर सकता है।

बस उपयोग करें convmv --unescape /some_path/target_file। यह ड्राई-रन करेगा।

एक बार पुष्टि कर लेने के बाद, convmv --notest --unescape /some_path/target_fileजारी रखने के लिए उपयोग करें।

इस कार्यक्रम का मुखपृष्ठ है: http://j3e.de/linux/convmv/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.