2017-08-06 27349 views
1

我使用下面的函數來編碼URL /在我的bash腳本標題編碼URL UTF8 - 殼腳本

urlencode() { 
    # urlencode <string> 
    old_lc_collate=$LC_COLLATE 
    LC_COLLATE=C 

    local length="${#1}" 
    for ((i = 0; i < length; i++)); do 
     local c="${1:i:1}" 
     case $c in 
      [a-zA-Z0-9.~_-]) printf "$c" ;; 
      *) printf '%%%02X' "'$c" ;; 
     esac 
    done 

    LC_COLLATE=$old_lc_collate 
} 

了出來放了一些PARAMS如下:

description=%627%644%639%628%627%62F%64A 
downloadurl=http%3A%2F%2Fmedia.myhomepage.com%2Fmedia%2FVT-142437WE-WEB-IRQ-MOSUL-PROGRESS-HAWAMDA_2017-03-08_14%3A28%3A12.mp4 
title=%623%647%644GKxS7otlAsujiRxXHTvshUE9 

也使用下面的java代碼來編碼相同的參數

URLEncoder.encode(video.getHeadline() , UTF_8_ENCODING).replace("+", "%20"); 
URLEncoder.encode(video.getHeadline() , UTF_8_ENCODING) 

和out是不同的bash

description=%D8%A7%D9%82%D8%AA%D8%AD%D9%85%D8%AA%20%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%AA%20%D8%A7%D9%84%D8%B9%D8%B1%D8%A7%D9%82%D9%8A%D8%A9%20%D8%AD%D9%8A%20%D8%A7%D9%84%D9%85%D9%86%D8%B5%D9%88%D8%B1%20%D8%BA%D8%B1%D8%A8%20%D8%A7%D9%84%D9%85%D9%88%D8%B5%D9%84%20%D8%B6%D9%85%D9%86%20%D8%AA%D9%82%D8%AF%D9%85%D9%87%D8%A7%20%D9%81%D9%8A%20%D8%A7%D9%84%D8%B3%D8%A7%D8%AD%D9%84%20%D8%A7%D9%84%D8%BA%D8%B1%D8%A8%D9%8A%20%D9%85%D9%86%20%D8%A7%D9%84%D9%85%D8%AF%D9%8A%D9%86%D8%A9%20%D8%AA%D9%85%D9%87%D9%8A%D8%AF%D8%A7%20%D9%84%D8%A7%D8%B3%D8%AA%D8%B9%D8%A7%D8%AF%D8%AA%D9%87%D8%A7%20%D9%85%D9%86%20%D8%AF%D8%A7%D8%B9%D8%B4.%20%D9%85%D9%86%20%D8%AC%D9%87%D8%A9%20%D8%A3%D8%AE%D8%B1%D9%89%20%D8%AE%D9%8A%D9%91%D8%B1%20%D8%B1%D8%A6%D9%8A%D8%B3%20%D8%A7%D9%84%D9%88%D8%B2%D8%B1%D8%A7%D8%A1%20%D8%A7%D9%84%D8%B9%D8%B1%D8%A7%D9%82%D9%8A%20%D8%AD%D9%8A%D8%AF%D8%B1%20%D8%A7%D9%84%D8%B9%D8%A8%D8%A7%D8%AF%D9%8A%20%D9%85%D8%B3%D9%84%D8%AD%D9%8A%20%D8%A7%D9%84%D8%AA%D9%86%D8%B8%D9%8A%D9%85%20%D8%A8%D9%8A%D9%86%20%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%B3%D9%84%D8%A7%D9%85%20%D9%88%D8%A7%D9%84%D9%82%D8%AA%D9%84. 


downloadurl=http%3A%2F%2FFmedia.myhomepage.com%2Fmedia%2Fvideos%2F2017%2F03%2F08%2FVT-142437WE-WEB-IRQ-MOSUL-PROGRESS-HAWAMDA_2017-03-08_14%3A28%3A12.mp4 


title=%D8%A7%D9%84%D8%B9%D8%A8%D8%A7%D8%AF%D9%8A%20%D9%8A%D8%AE%D9%8A%D8%B1%20%D9%85%D8%B3%D9%84%D8%AD%D9%8A%20%D8%AF%D8%A7%D8%B9%D8%B4%20%D8%A8%D9%8A%D9%86%20%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%B3%D9%84%D8%A7%D9%85%20%D9%88%D8%A7%D9%84%D9%82%D8%AA%D9%84 

請告知我怎麼能achgive Java具有的相同輸出喜歡在bash shell中java.net.URLEncoder.encode()的對應

+0

看起來像你的標題和描述是多字節的UTF-8序列,你能證實嗎? –

+0

是的,這是正確的 – Jecki

+0

你可以調用外部命令(即'curl')還是僅限於純粹的bash? –

回答

0

這oneliner依靠xxd得到hexdump都慶典字符串,則預先將逃逸:

string="العبادي يخير مسلحي داعش بين الاستسلام والقتل" 
echo $string | xxd -g 1 | cut -d' ' -f2-17 | sed 's/\([0-9a-f][0-9a-f]\) /%\1/g' | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n//g' 

結果:

%D8%A7%D9%84%D8%B9%D8%A8%D8%A7 %D8%AF%D9%8A%20d9%8A%D8%AE%D9%8A%D8%B1%20%D9%85%D8%B3%D9%84%d8ad%D9%8A%20%D8%AF %D8%A7%D8%B9%D8%B4%20%D8%A8%d98a%D9%86%20%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%b3d9 %84%D8%A7%D9%85%20%D9%88%D8%A7%D9%84%D9%82%d8aa%D9%84%0A

1

如果需要URL編碼數據只是稍後將它傳遞給curl(正如你在評論中提到的那樣),我會建議讓curl負責使用--data-urlencode <data>選項的編碼。

例如:

title="Mačka" 
url="http://google.com/?q=mačka" 
curl -G example.com/?foo=bar --data-urlencode "title=$title" --data-urlencode "url=$url" 

使得像請求:

GET /?foo=bar&title=Ma%C4%8Dka&url=http%3A%2F%2Fgoogle.com%2F%3Fq%3Dma%C4%8Dka 

通知使用-G迫使GET方法;沒有它,任何--data-*選項默認爲POST方法和正文中的參數。