encodeURI() 為什麼URI要編碼?

encodeURI 可以為URI編碼,使其符合URI規範。

URI是Uniform Resource Identifier 的縮寫,中文翻譯為 "統一資源標誌符" 。

為什麼要對URI編碼,什麼時候用的到URI編碼?

如果對URI編碼很陌生,那我們先來看個例子,看看URI編碼跟我們有多常接觸。

先打開google的網頁:

https://www.google.com.tw/

在搜尋欄輸入"維克的煩惱",按下google搜尋,等結果出來。

老實說我滿期待你看到這個部落格在第一名的位置 XD"。

不過這不是現在的重點。我們把視線移到位址欄。

把它複製下來:

https://www.google.com.tw/#hl=zh-TW&tbo=d&site=&source=hp&q=%E7%B6%AD%E5%85%8B%E7%9A%84%E7%85%A9%E6%83%B1&oq=%E7%B6%AD%E5%85%8B%E7%9A%84%E7%85%A9%E6%83%B1&gs_l=hp.12...36398.36398.0.37530.1.1.0.0.0.0.34.34.1.1.0.pchsnhae..0.0...1c.1.Y1Fa80-ocAE&bav=on.2,or.r_gc.r_pw.&bvm=bv.1355325884,d.dGY&fp=152a56cbfacd4238&bpcl=39967673&biw=1843&bih=887

好長一串。現在來看一下q=後面的那一串紅色編碼。

var str="%E7%B6%AD%E5%85%8B%E7%9A%84%E7%85%A9%E6%83%B1" ;

document.writeln(decodeURI(str));

輸出=>維克的煩惱。

沒錯這串紅色編碼就是對"維克的煩惱"進行encodeURI編碼的結果。所以說encodeURI就藏在生活中..XD"

(事實上對於參數的URI編碼,使用encodeURIComponent()才是正確的,可以避免功能性的字符造成URI的混淆,

不過這裡沒有使用功能性字符,所以其實也沒啥差。)

現在來點耐心,看看個URI簡短介紹吧,好吧!如果還是不習慣URI這名稱的話,其實可以暫時把它想成是網址...

雖然URI不只被用在網址的表現,但是身為一個WEB前端應用程式開發人員...........業餘的..我...

最常接觸到的應該也是網址了吧。

URI短介:

URI可以被當成URL(統一資源定位符)或URN(统一资源名),或是兩個合起來。

URL通常代表著位址,URN則是資源的名字。

絕對URI( absolute URI )的語法如下:

<scheme>:<scheme-specific-part>

不過我們常用的網址是URI的一個子集,一般型URI(generic URI 是這樣翻譯嗎==?  文章尾端有附原文),

語法如下:

<scheme>://<authority><path>?<query>

拿這文章的網址當個例子吧:

http://www.victsao.com/blog/81-javascript/89-javascript-encodeuri-uri

scheme:http

authority:www.victsao.com

path:/blog/81-javascript/89-javascript-encodeuri-uri

query:尷尬了!沒有耶!這啥爛例子。

好吧來看一下RFC3986 附的的例子吧,一次來兩個:

來自:http://tools.ietf.org/html/rfc3986

foo://example.com:8042/over/there?name=ferret#nose
             \_/   \______________/\_________/ \_________/ \__/
               |                   |                       |                    |              |
          scheme      authority             path             query     fragment
              |    ____________________|__
             / \  /                                           \
             urn:example:animal:ferret:nose

URI編碼:

URI允許的字元包括:大小寫英文字母,數字,標記(mark),保留字跟跳脫編碼。

標記:-  _  .  !  ~  *  ‘  (  )

保留字:;  /  ?  :  @  &  =  + $  ,

跳脫編碼:%加兩個16進位編碼。例:%AB、%FB

注意:%會出現在URI中,但它本身需要被編碼。

看得很混亂看看例子吧:

標記:

var str="-_.!~*‘()";
var a=encodeURI(str);
document.writeln(a);  輸出==>-_.!~*‘()
var b=encodeURIComponent(str);
document.writeln(b);  輸出==>-_.!~*‘()

保留字:

var str=";/?:@&=+$,";
var a=encodeURI(str);
document.writeln(a);   輸出==>;/?:@&=+$,
var b=encodeURIComponent(str);
document.writeln(b);   輸出==>%3B%2F%3F%3A%40%26%3D%2B%24%2C

URI拒絕字元:

var str="<>#%<>";
var a=encodeURI(str);
document.writeln(a);    輸出==>%3C%3E#%25%3C%3E  注意: #沒被編碼
var b=encodeURIComponent(str);
document.writeln(b);    輸出==>%3C%3E%23%25%3C%3E

何時會使用到encodeURI()與encodeURIComponent():

最常接觸的大概就是AJAX吧,AJAX就是用傳遞網址來要求資料。

看個例子吧:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JSON/Atom Custom Search API Example</title>
</head>
<body >
<div id="content"></div>
<script type="text/javascript">
var xmlhttp;
xmlhttp = new XMLHttpRequest();    //舊型IE不支援這作法
function showwho() {
if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById(‘content‘).innerHTML = xmlhttp.responseText;
 }
 }
function test() {
var name = ‘維克‘;
url = ‘test.php?who=‘ + name + "&time=" + new Date().getTime();
xmlhttp.open(‘GET‘, url, true);
xmlhttp.onreadystatechange = showwho;
xmlhttp.send(null);
}
</script>

</body>

</html>

PHP:

<?php

echo($_GET[‘who‘]);

?>

這在IE9測試的結果,會出現亂碼!但在chrome是正常顯示的。

位時麼會這樣?

因為"維克"不是個URI的標準字元,PHP的GET認為所有非法URI字元都應該已經被編碼。

所以在處理時也會在解碼回來。沒編碼過的字元被解碼傳回來,結果就變亂碼了。

那為啥Chrome可以正常顯示?

因為Chrome在傳遞網址時會自動將非法的URI字元編碼!

聽說IE經過設定後也可以自動編碼URI非法字元,

但是即便如此瀏覽器依賴的程式設計並不是個好主意。

確保的做法是,對"維克"做encodeURIComponent ()的動作。

var name = ‘維克‘;

name=encodeURIComponent(name);

然後再傳出去!

傳遞表單時其實也會用到URI編碼。

表單傳遞其實有內建編碼傳遞方式,application/x-www-form-urlencoded

這邊碼方式並不標準,但接受度很廣..

有空閒在來多寫一些例子,先這樣吧!~~~~

沒寫到的:

1. encodeURI()跟encodeURIComponent ()都認定輸入字串為UTF-8做編碼。

並不作轉碼的動作,請確定你給他的字串是UTF-8編碼。

2.ECMA-262 5.1 Edition June/2011  支援的URI版本是RFC2396 而不是較新的RFC3986

3.在google 例子中出現的#是代表片段標識符

4.URI其實還滿複雜的,我都不太懂==",反正encodeURI就對了。

來自http://tools.ietf.org/html/rfc2396的部分原文:

An absolute URI contains the name of the scheme being used (<scheme>)
   followed by a colon (":") and then a string (the <scheme-specific-
   part>) whose interpretation depends on the scheme.

The URI syntax does not require that the scheme-specific-part have
   any general structure or set of semantics which is common among all
   URI.  However, a subset of URI do share a common syntax for
   representing hierarchical relationships within the namespace.  This
   "generic URI" syntax consists of a sequence of four main components:

<scheme>://<authority><path>?<query>

原文地址:https://www.cnblogs.com/Oliver1993/p/11632178.html

时间: 2024-10-26 15:43:22

encodeURI() 為什麼URI要編碼?的相关文章

Python 基礎 - 字符編碼

Python 解釋器在加載 .py 文件中的代碼時,會對內容進行編碼 (默認 ascill) ASCII (American Standard Code for Information Interchange, 美國信息交换標準代碼)是基於拉丁字母的一套電腦编碼系统, 主要用於顯示現代英語和部分支援其他西歐語言,其最多只能用 8 bit來表示(一個字節),即: 2**8 = 256-1,所以ASCII碼最多只能表示255個符號  關於中文編碼 為了處理漢字,程序員設計了用於簡體中文的GB2312

Python編碼格式錯誤解決方案及案例

Python格式錯誤解決方案及案例 這幾天在玩爬蟲,在解析和提取内容時經常出現由於内容格式問題導致出錯,為防止以後出錯,整下一下,以下是這幾天的總結: 1. 特殊符號或表情符號等 背景:爬取一個烹飪教學網站,在用BeautifulSoup解析網頁時報錯: UnicodeEncodeError: 'UCS-2' codec can't encode character '\U0001f44d' in position 0: Non-BMP character not supported in Tk

為什麼擠出頭的喉管需要散熱?

為什麼擠出頭的喉管需要散熱?? 转自http://diy3dprint.blogspot.tw/2014/01/blog-post.html 從 J-Head 鐵氟龍管中清理出來,倒流之後黏在鐵氟龍管內側的塑料.這就是擠出頭卡住的元兇. 大家裝機器的心情,都相當興奮,恨不得可以趕快開始列印.幾乎所有的同好,都會在還沒裝喉管散熱風扇之前,就急著開始列印.運氣好的可以印個小方盒什麼的沒問題,運氣不好的就是擠料完全擠不動,然後墮入清噴頭地獄.為什麼擠出機構會需要散熱呢?不是把塑料熔化後,軟軟得,就能擠

linux常用編碼處理

--經驗果然是踩坑才過來的,每一個經驗也許都會隱藏着一次被坑的經歷 p { margin-bottom: 0.1in; line-height: 120% } code.cjk { font-family: "Courier New", monospace } 中文出現亂碼主要因爲編碼不同,編碼不同主要分爲一下兩種情況: 1.文件本身編碼不一致 2.某些軟件自帶轉碼功能 注意: 英文字母也需要轉碼!!!一般情況下沒有影響,但是在某些情況下會導致非常嚴重的影響並且不能找到原因. Ex:

為什麼佛法說夫妻是緣、兒女是債,無緣不聚、無債不來?這個值得分享!

為什麼佛法說夫妻是緣.兒女是債,無緣不聚.無債不來? 佛經上說:男人,女人到世界上幹啥來了? 是了緣來的. 無緣不聚,無債不來. 做女人的啊,多數都怨恨丈夫,不怨恨丈夫的少. 男人也許會說:我媳婦還恨我啊,我還不知道呢. 我告訴你,愛有多深,恨就有多深. 女人為什麼抱怨的多? 因為女人從嫁給男人的那一刻起, 就把全身心都交給了這個男人, 成家以後,愛這個家,愛丈夫,愛孩子, 為了這家拼命地幹活, 結果,這個丈夫不會說好話, 有的男人一輩子不會說一句好話, 從來沒有說過:“妻子,你辛苦了!” 甚至

蜜蜂為什麼每次都能原路返回,不會迷路

蜜蜂在昆蟲分類學上屬於蜜蜂科昆蟲的統稱,根據化石資料在第三紀晚始新世地層中己大量發現,許多種類具有巨大的經濟價值,被稱為資源昆蟲,與人類生活密切相關,在我國古代就有對蜜蜂及其用途的記載,下面我們就一起來看一看蜜蜂為什麼不會迷路吧! 蜜蜂為什麼不會迷路? 蜜蜂頭部生有複眼,複眼約由6300隻小眼組成,每隻小眼裏有8個成輻射狀排列的感光細胞,蜜蜂就靠這些小眼感受偏正光導航,所以不會迷失方向.所謂偏正光,就是只在某個方向振動或者某個方向的振動佔優勢的光.天空中任何一點偏正光的方向都垂直於太陽.觀察者和

字符編碼

128 个 ASCII 字符(Unicode 范围由 U+0000 至 U+007F)只需一个字节. 带有变音符号的拉丁文.希腊文.西里尔字母.亚美尼亚语.希伯来文.阿拉伯文.叙利亚文及马尔代夫语(Unicode 范围由 U+0080 至 U+07FF)需要二个字节. 其他基本多文种平面(BMP)中的字符(CJK属于此类-Qieqie注)使用三个字节. 其他 Unicode 辅助平面的字符使用四字节编码. GBK编码,一个汉字占两个字节.汉字在GB家族中是双字节 UTF-16编码,通常汉字占两个

[fw]Die 為什麼不能用現在完成式?

have PP是表示"從以前到現在"都直在做的事情 Mr. Chen has taught English for 30 years.---表示teach的動作持續了30年,但Mr. Chen has died for 30 years.---就錯了!Mr. Chen 不能死了,隔天再die一次,一直到今天又die一次吧! 而dead形容詞是"狀態",狀態就可以"延續",而形容詞前須有be動詞,因此"死亡"的狀態必須寫成Mr.

Sql Server Report Service 的部署问题(Reporting Service 2014為什麼不需要IIS就可以運行)

http://www.cnblogs.com/syfblog/p/4651621.html Sql Server Report Service 的部署问题 近期在研究SSRS部署问题,因为以前也用到过SSRS报表,但当时开发的报表是有专 门的集成系统的,不需要我自己去部署,所以对这一块的部署也不熟悉,我记得当时我是直接开发出一个SSRS 报表,然后会通过自动上传的方式上传到微软Dynamic CRM系统中,它带有自带的集成部署.而现如今,看来又得重新回去恶补一下部署的信息了.经过无数的错误的再错