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="
參考文章