В этой небольшой статье мы хотим показать, как в Bash создать эквивалент функции JavaScript encodeURIComponent() для экранирования всех небезопасных символов в некотором URL.
Приведенный ниже пример позволяет также кодировать символы Unicode.
Практический пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #!/bin/bash function create_utf8_code() { local code="$(echo -n "$1" | xxd -ps)" local length="${#code}" local i for (( i = 0; i < length; i += 2 )) do echo -n "%${code:$i:2}" | tr '[:lower:]' '[:upper:]' done } function encode_uri_component() { local text="${1}" local length="${#text}" local i char for (( i = 0; i < length; ++i )) do char="${text:$i:1}" [[ "$char" =~ [-_.!~*\'()a-zA-Z0-9] ]] && echo -n "$char" || create_utf8_code "$char" done } |
Примеры использования
1 2 3 4 | text="Hi! How are you? Dangerous characters: ?#&" encoded_text="$(encode_uri_component "$text")" echo "$encoded_text" # Hi!%20How%20are%20you%3f%20Dangerous%20characters%3a%20%3f%23%26 |
Вывод:
1 | Hi!%20How%20are%20you%3F%20Dangerous%20characters%3A%20%3F%23%26 |
Пример 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # Not escaped characters: echo $(encode_uri_component "0123456789") # 0123456789 echo $(encode_uri_component "abcdefghijklmnopqrstuvwxyz") # abcdefghijklmnopqrstuvwxyz echo $(encode_uri_component "ABCDEFGHIJKLMNOPQRSTUVWXYZ") # ABCDEFGHIJKLMNOPQRSTUVWXYZ echo $(encode_uri_component "~!*-_.'()") # ~!*-_.'() # Some escaped characters: echo $(encode_uri_component "日本") # %E6%97%A5%E6%9C%AC echo $(encode_uri_component "Россия") # %D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F echo $(encode_uri_component "ąćęłńóśźż") # %C4%85%C4%87%C4%99%C5%82%C5%84%C3%B3%C5%9B%C5%BA%C5%BC echo $(encode_uri_component "@:/?#&=") # %40%3A%2F%3F%23%26%3D echo $(encode_uri_component "❤️") # %F0%9F%9A%80%F0%9F%8D%8F%F0%9F%8D%8C%E2%9D%A4%EF%B8%8F%F0%9F%92%BB%F0%9F%99%82 echo $(encode_uri_component $' \t\n') # %20%09%0A |
Вывод
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 0123456789 abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ ~!*-_.'() %E6%97%A5%E6%9C%AC %D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F %C4%85%C4%87%C4%99%C5%82%C5%84%C3%B3%C5%9B%C5%BA%C5%BC %40%3A%2F%3F%23%26%3D %F0%9F%9A%80%F0%9F%8D%8F%F0%9F%8D%8C%E2%9D%A4%EF%B8%8F%F0%9F%92%BB%F0%9F%99%82 %20%09%0A |