ROR(47)url編碼與Base64編碼的區(qū)別

URL 編碼 Base64 編碼的區(qū)別

1 url編碼

1.1 什么是 url 編碼

型如/url/?%E5%B9%BF%E5%B7%9E=020形式的 url 是編碼后的 url 也叫做百分號(hào)編碼。

1.2 為什么要用 url 編碼

因?yàn)?url RFC3986文檔規(guī)定,Url中只允許包含英文字母(a-zA-Z)、數(shù)字(0-9)、-_.~4個(gè)特殊字符以及所有保留字符。url編碼主要是為了解決一些url中的一些特殊字符和歧義字符或者中文字符的傳輸問(wèn)題。

1.3 編碼方式

在特殊字符前加上%,例如“name1=value1”,其中value1的值是“va&lu=e1”,對(duì)其進(jìn)行URL編碼后:“name1=va%26lu%3D”,這樣服務(wù)端會(huì)把緊跟在“%”后的字節(jié)當(dāng)成普通的字節(jié),就是不會(huì)把它當(dāng)成各個(gè)參數(shù)或鍵值對(duì)的分隔符。因此,Url編碼通常也被稱為百分號(hào)編碼

#Generate URL-encoded form data from given enum.
URI.encode_www_form([["q", "ruby"], ["q", "perl"], ["lang", "電費(fèi)大"]])
=>"q=ruby&q=perl&lang=%E7%94%B5%E8%B4%B9%E5%A4%A7"
URI.encode_www_form ({a:1,b:2})
=> "a=1&b=2"
#If enc is given, convert str to the encoding before percent encoding.
URI.encode_www_form_component([["q", "ruby"], ["q", "perl"], ["lang", "電費(fèi)大"]])
=>"%5B%5B%22q%22%2C+%22ruby%22%5D%2C+%5B%22q%22%2C+%22perl%22%5D%2C+%5B%22lang%22%2C+%22%E7%94%B5%E8%B4%B9%E5%A4%A7%22%5D%5D"
URI.encode_www_form_component "電費(fèi)大"
=> "%E7%94%B5%E8%B4%B9%E5%A4%A7" E5A4A7

 "阿斯蒂芬".unpack("U*")
=> [38463, 26031, 33922, 33452]

1.4 什么時(shí)候需要漢字

  • 網(wǎng)址路徑中包含漢字【UTF-8】
  • 網(wǎng)址的查詢字符串包含漢字【操作系統(tǒng)編碼】
  • Get方法生成的URL包含漢字,在已打開(kāi)的網(wǎng)頁(yè)上,直接用Get或Post方法發(fā)出HTTP請(qǐng)求,例form方式:【meta標(biāo)簽的charset屬性定義的編碼】
  • Ajax調(diào)用的URL包含漢字:【不同瀏覽器的編碼方式不同】
    對(duì)包含中文的URL的處理問(wèn)題,不同瀏覽器表現(xiàn)不同,很混亂,保證客戶端只用一種編碼方法向服務(wù)器發(fā)出請(qǐng)求的解決方案:使用Javascript先對(duì)URL編碼,然后再向服務(wù)器提交,不要給瀏覽器插手的機(jī)會(huì)。因?yàn)镴avascript的輸出總是一致的,所以就保證了服務(wù)器得到的數(shù)據(jù)是格式統(tǒng)一的。

2 base64 編碼

2.1 什么是 base64 編碼

ase64是一種基于64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的表示方法。 base是二進(jìn)制到文本字符串的轉(zhuǎn)換方法,常用于在URL、Cookie、網(wǎng)頁(yè)中傳輸少量二進(jìn)制數(shù)據(jù)。如

Base64.encode64("fined method `code")
=> "ZmluZWQgbWV0aG9kIGBjb2Rl\n"

2.2 為什么要進(jìn)行base64編碼

是為了滿足電子郵件中不能直接使用非ASCII碼字符的規(guī)定。將8位的非英語(yǔ)字符轉(zhuǎn)化為7位的ASCII字符。

2.3 什么時(shí)候進(jìn)行base64編碼:

  • 上傳圖片、文件時(shí)
  • 拼URL的時(shí)候,base64編碼后,肉眼看不出信息?

2.4 其他

  • Base64編碼會(huì)把3字節(jié)的二進(jìn)制數(shù)據(jù)編碼為4字節(jié)的文本數(shù)據(jù),長(zhǎng)度增加33%,好處是編碼后的文本數(shù)據(jù)可以在郵件正文、網(wǎng)頁(yè)等直接顯示。
  • Base64是一種通過(guò)查表的編碼方法,不能用于加密,即使使用自定義的編碼表也不行

另有一種用于正則表達(dá)式的改進(jìn)Base64變種,它將“+”和“/”改成了“!”和“-”,因?yàn)椤?”,“*”以及前面在IRCu中用到的“[”和“]”在正則表達(dá)式中都可能具有特殊含義。

str = "This is line one\nThis is line two\nThis is line three\nAnd so on..."
Base64.encode64(str)
=>"VGhpcyBpcyBsaW5lIG9uZQpUaGlzIGlzIGxpbmUgdHdvClRoaXMgaXMgbGlu\nZSB0aHJlZQpBbmQgc28gb24uLi4=\n"
Base64.strict_encode64(str)
=>"VGhpcyBpcyBsaW5lIG9uZQpUaGlzIGlzIGxpbmUgdHdvClRoaXMgaXMgbGluZSB0aHJlZQpBbmQgc28gb24uLi4="
Base64.urlsafe_encode64(str)
=>"VGhpcyBpcyBsaW5lIG9uZQpUaGlzIGlzIGxpbmUgdHdvClRoaXMgaXMgbGluZSB0aHJlZQpBbmQgc28gb24uLi4="

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容