<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      關(guān)于URL編碼/javascript/js url 編碼

      一、問題的由來

      URL就是網(wǎng)址,只要上網(wǎng),就一定會用到。 

      一般來說,URL只能使用英文字母、阿拉伯?dāng)?shù)字和某些標(biāo)點符號,不能使用其他文字和符號。比如,世界上有英文字母的網(wǎng)址 “http://www.abc.com”,但是沒有希臘字母的網(wǎng)址“http://www.aβγ.com”(讀作阿爾法-貝塔-伽瑪.com)。這是因為網(wǎng)絡(luò)標(biāo)準(zhǔn)RFC 1738做了硬性規(guī)定:

      "...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."

      “只有字母和數(shù)字[0-9a-zA-Z]、一些特殊符號“$-_.+!*'(),”[不包括雙引號]、以及某些保留字,才可以不經(jīng)過編碼直接用于URL。”

      這意味著,如果URL中有漢字,就必須編碼后使用。但是麻煩的是,RFC 1738沒有規(guī)定具體的編碼方法,而是交給應(yīng)用程序(瀏覽器)自己決定。這導(dǎo)致“URL編碼”成為了一個混亂的領(lǐng)域。

      下面就讓我們看看,“URL編碼”到底有多混亂。我會依次分析四種不同的情況,在每一種情況中,瀏覽器的URL編碼方法都不一樣。把它們的差異解釋清楚之后,我再說如何用Javascript找到一個統(tǒng)一的編碼方法。

      二、情況1:網(wǎng)址路徑中包含漢字

      打開IE(我用的是8.0版),輸入網(wǎng)址“http://zh.wikipedia.org/wiki/春節(jié)”。注意,“春節(jié)”這兩個字此時是網(wǎng)址路徑的一部分。

       

      查看HTTP請求的頭信息,會發(fā)現(xiàn)IE實際查詢的網(wǎng)址是“http://zh.wikipedia.org/wiki/%E6%98%A5%E8%8A%82”。也就是說,IE自動將“春節(jié)”編碼成了“%E6%98%A5%E8%8A%82”。

       

      我們知道,“春”和“節(jié)”的utf-8編碼分別是“E6 98 A5”和“E8 8A 82”,因此,“%E6%98%A5%E8%8A%82”就是按照順序,在每個字節(jié)前加上%而得到的。(具體的轉(zhuǎn)碼方法,請參考我寫的《字符編碼筆記》。)

      在Firefox中測試,也得到了同樣的結(jié)果。所以,結(jié)論1就是,網(wǎng)址路徑的編碼,用的是utf-8編碼。

      三、情況2:查詢字符串包含漢字

      在IE中輸入網(wǎng)址“http://www.baidu.com/s?wd=春節(jié)”。注意,“春節(jié)”這兩個字此時屬于查詢字符串,不屬于網(wǎng)址路徑,不要與情況1混淆。

       

      查看HTTP請求的頭信息,會發(fā)現(xiàn)IE將“春節(jié)”轉(zhuǎn)化成了一個亂碼。

       

      切換到十六進制方式,才能清楚地看到,“春節(jié)”被轉(zhuǎn)成了“B4 BA BD DA”。

       

      我們知道,“春”和“節(jié)”的GB2312編碼(我的操作系統(tǒng)“Windows XP”中文版的默認(rèn)編碼)分別是“B4 BA”和“BD DA”。因此,IE實際上就是將查詢字符串,以GB2312編碼的格式發(fā)送出去。

      Firefox的處理方法,略有不同。它發(fā)送的HTTP Head是“wd=%B4%BA%BD%DA”。也就是說,同樣采用GB2312編碼,但是在每個字節(jié)前加上了%。

       

      所以,結(jié)論2就是,查詢字符串的編碼,用的是操作系統(tǒng)的默認(rèn)編碼。

      四、情況3:Get方法生成的URL包含漢字

      前面說的是直接輸入網(wǎng)址的情況,但是更常見的情況是,在已打開的網(wǎng)頁上,直接用Get或Post方法發(fā)出HTTP請求。

      根據(jù)臺灣中興大學(xué)呂瑞麟老師的試驗,這時的編碼方法由網(wǎng)頁的編碼決定,也就是由HTML源碼中字符集的設(shè)定決定。

        <meta http-equiv="Content-Type" content="text/html;charset=xxxx">

      如果上面這一行最后的charset是UTF-8,則URL就以UTF-8編碼;如果是GB2312,URL就以GB2312編碼。

      舉例來說,百度是GB2312編碼,Google是UTF-8編碼。因此,從它們的搜索框中搜索同一個詞“春節(jié)”,生成的查詢字符串是不一樣的。

      百度生成的是%B4%BA%BD%DA,這是GB2312編碼。

       

      Google生成的是%E6%98%A5%E8%8A%82,這是UTF-8編碼。

       

      所以,結(jié)論3就是,GET和POST方法的編碼,用的是網(wǎng)頁的編碼。

      五、情況4:Ajax調(diào)用的URL包含漢字

      前面三種情況都是由瀏覽器發(fā)出HTTP請求,最后一種情況則是由Javascript生成HTTP請求,也就是Ajax調(diào)用。還是根據(jù)呂瑞麟老師的文章,在這種情況下,IE和Firefox的處理方式完全不一樣。

      舉例來說,有這樣兩行代碼:

        url = url + "?q=" +document.myform.elements[0].value; // 假定用戶在表單中提交的值是“春節(jié)”這兩個字

        http_request.open('GET', url, true);

      那么,無論網(wǎng)頁使用什么字符集,IE傳送給服務(wù)器的總是“q=%B4%BA%BD%DA”,而Firefox傳送給服務(wù)器的總是“q=%E6%98%A5%E8%8A%82”。也就是說,在Ajax調(diào)用中,IE總是采用GB2312編碼(操作系統(tǒng)的默認(rèn)編碼),而Firefox總是采用utf-8編碼。這就是我們的結(jié)論4。

      六、Javascript函數(shù):escape()

      好了,到此為止,四種情況都說完了。

      假定前面你都看懂了,那么此時你應(yīng)該會感到很頭痛。因為,實在太混亂了。不同的操作系統(tǒng)、不同的瀏覽器、不同的網(wǎng)頁字符集,將導(dǎo)致完全不同的編碼結(jié)果。如果程序員要把每一種結(jié)果都考慮進去,是不是太恐怖了?有沒有辦法,能夠保證客戶端只用一種編碼方法向服務(wù)器發(fā)出請求?

      回答是有的,就是使用Javascript先對URL編碼,然后再向服務(wù)器提交,不要給瀏覽器插手的機會。因為Javascript的輸出總是一致的,所以就保證了服務(wù)器得到的數(shù)據(jù)是格式統(tǒng)一的。

      Javascript語言用于編碼的函數(shù),一共有三個,最古老的一個就是escape()。雖然這個函數(shù)現(xiàn)在已經(jīng)不提倡使用了,但是由于歷史原因,很多地方還在使用它,所以有必要先從它講起。

      實際上,escape()不能直接用于URL編碼,它的真正作用是返回一個字符的Unicode編碼值。比如“春節(jié)”的返回結(jié)果是%u6625%u8282,也就是說在Unicode字符集中,“春”是第6625個(十六進制)字符,“節(jié)”是第8282個(十六進制)字符。

       

      它的具體規(guī)則是,除了ASCII字母、數(shù)字、標(biāo)點符號“@ * _ + - . /”以外,對其他所有字符進行編碼。在\u0000到\u00ff之間的符號被轉(zhuǎn)成%xx的形式,其余符號被轉(zhuǎn)成%uxxxx的形式。對應(yīng)的解碼函數(shù)是unescape()。

      所以,“Hello World”的escape()編碼就是“Hello%20World”。因為空格的Unicode值是20(十六進制)。

       

      還有兩個地方需要注意。

      首先,無論網(wǎng)頁的原始編碼是什么,一旦被Javascript編碼,就都變?yōu)閡nicode字符。也就是說,Javascipt函數(shù)的輸入和輸出,默認(rèn)都是Unicode字符。這一點對下面兩個函數(shù)也適用。

       

      其次,escape()不對“+”編碼。但是我們知道,網(wǎng)頁在提交表單的時候,如果有空格,則會被轉(zhuǎn)化為+字符。服務(wù)器處理數(shù)據(jù)的時候,會把+號處理成空格。所以,使用的時候要小心。

      七、Javascript函數(shù):encodeURI()

      encodeURI()是Javascript中真正用來對URL編碼的函數(shù)。

      它著眼于對整個URL進行編碼,因此除了常見的符號以外,對其他一些在網(wǎng)址中有特殊含義的符號“; / ? : @ & = + $ , #”,也不進行編碼。編碼后,它輸出符號的utf-8形式,并且在每個字節(jié)前加上%。

       

      它對應(yīng)的解碼函數(shù)是decodeURI()。

       

      需要注意的是,它不對單引號'編碼。

      八、Javascript函數(shù):encodeURIComponent()

      最后一個Javascript編碼函數(shù)是encodeURIComponent()。與encodeURI()的區(qū)別是,它用于對URL的組成部分進行個別編碼,而不用于對整個URL進行編碼。

      因此,“; / ? : @ & = + $ , #”,這些在encodeURI()中不被編碼的符號,在encodeURIComponent()中統(tǒng)統(tǒng)會被編碼。至于具體的編碼方法,兩者是一樣。

       

      它對應(yīng)的解碼函數(shù)是decodeURIComponent()。

      一、問題的由來

      URL就是網(wǎng)址,只要上網(wǎng),就一定會用到。

       

      一般來說,URL只能使用英文字母、阿拉伯?dāng)?shù)字和某些標(biāo)點符號,不能使用其他文字和符號。比如,世界上有英文字母的網(wǎng)址 “http://www.abc.com”,但是沒有希臘字母的網(wǎng)址“http://www.aβγ.com”(讀作阿爾法-貝塔-伽瑪.com)。這是因為網(wǎng)絡(luò)標(biāo)準(zhǔn)RFC 1738做了硬性規(guī)定:

      "...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."

      “只有字母和數(shù)字[0-9a-zA-Z]、一些特殊符號“$-_.+!*'(),”[不包括雙引號]、以及某些保留字,才可以不經(jīng)過編碼直接用于URL。”

      這意味著,如果URL中有漢字,就必須編碼后使用。但是麻煩的是,RFC 1738沒有規(guī)定具體的編碼方法,而是交給應(yīng)用程序(瀏覽器)自己決定。這導(dǎo)致“URL編碼”成為了一個混亂的領(lǐng)域。

      下面就讓我們看看,“URL編碼”到底有多混亂。我會依次分析四種不同的情況,在每一種情況中,瀏覽器的URL編碼方法都不一樣。把它們的差異解釋清楚之后,我再說如何用Javascript找到一個統(tǒng)一的編碼方法。

      二、情況1:網(wǎng)址路徑中包含漢字

      打開IE(我用的是8.0版),輸入網(wǎng)址“http://zh.wikipedia.org/wiki/春節(jié)”。注意,“春節(jié)”這兩個字此時是網(wǎng)址路徑的一部分。

       

      查看HTTP請求的頭信息,會發(fā)現(xiàn)IE實際查詢的網(wǎng)址是“http://zh.wikipedia.org/wiki/%E6%98%A5%E8%8A%82”。也就是說,IE自動將“春節(jié)”編碼成了“%E6%98%A5%E8%8A%82”。

       

      我們知道,“春”和“節(jié)”的utf-8編碼分別是“E6 98 A5”和“E8 8A 82”,因此,“%E6%98%A5%E8%8A%82”就是按照順序,在每個字節(jié)前加上%而得到的。(具體的轉(zhuǎn)碼方法,請參考我寫的《字符編碼筆記》。)

      在Firefox中測試,也得到了同樣的結(jié)果。所以,結(jié)論1就是,網(wǎng)址路徑的編碼,用的是utf-8編碼。

      三、情況2:查詢字符串包含漢字

      在IE中輸入網(wǎng)址“http://www.baidu.com/s?wd=春節(jié)”。注意,“春節(jié)”這兩個字此時屬于查詢字符串,不屬于網(wǎng)址路徑,不要與情況1混淆。

       

      查看HTTP請求的頭信息,會發(fā)現(xiàn)IE將“春節(jié)”轉(zhuǎn)化成了一個亂碼。

       

      切換到十六進制方式,才能清楚地看到,“春節(jié)”被轉(zhuǎn)成了“B4 BA BD DA”。

       

      我們知道,“春”和“節(jié)”的GB2312編碼(我的操作系統(tǒng)“Windows XP”中文版的默認(rèn)編碼)分別是“B4 BA”和“BD DA”。因此,IE實際上就是將查詢字符串,以GB2312編碼的格式發(fā)送出去。

      Firefox的處理方法,略有不同。它發(fā)送的HTTP Head是“wd=%B4%BA%BD%DA”。也就是說,同樣采用GB2312編碼,但是在每個字節(jié)前加上了%。

       

      所以,結(jié)論2就是,查詢字符串的編碼,用的是操作系統(tǒng)的默認(rèn)編碼。

      四、情況3:Get方法生成的URL包含漢字

      前面說的是直接輸入網(wǎng)址的情況,但是更常見的情況是,在已打開的網(wǎng)頁上,直接用Get或Post方法發(fā)出HTTP請求。

      根據(jù)臺灣中興大學(xué)呂瑞麟老師的試驗,這時的編碼方法由網(wǎng)頁的編碼決定,也就是由HTML源碼中字符集的設(shè)定決定。

        <meta http-equiv="Content-Type" content="text/html;charset=xxxx">

      如果上面這一行最后的charset是UTF-8,則URL就以UTF-8編碼;如果是GB2312,URL就以GB2312編碼。

      舉例來說,百度是GB2312編碼,Google是UTF-8編碼。因此,從它們的搜索框中搜索同一個詞“春節(jié)”,生成的查詢字符串是不一樣的。

      百度生成的是%B4%BA%BD%DA,這是GB2312編碼。

       

      Google生成的是%E6%98%A5%E8%8A%82,這是UTF-8編碼。

       

      所以,結(jié)論3就是,GET和POST方法的編碼,用的是網(wǎng)頁的編碼。

      五、情況4:Ajax調(diào)用的URL包含漢字

      前面三種情況都是由瀏覽器發(fā)出HTTP請求,最后一種情況則是由Javascript生成HTTP請求,也就是Ajax調(diào)用。還是根據(jù)呂瑞麟老師的文章,在這種情況下,IE和Firefox的處理方式完全不一樣。

      舉例來說,有這樣兩行代碼:

        url = url + "?q=" +document.myform.elements[0].value; // 假定用戶在表單中提交的值是“春節(jié)”這兩個字

        http_request.open('GET', url, true);

      那么,無論網(wǎng)頁使用什么字符集,IE傳送給服務(wù)器的總是“q=%B4%BA%BD%DA”,而Firefox傳送給服務(wù)器的總是“q=%E6%98%A5%E8%8A%82”。也就是說,在Ajax調(diào)用中,IE總是采用GB2312編碼(操作系統(tǒng)的默認(rèn)編碼),而Firefox總是采用utf-8編碼。這就是我們的結(jié)論4。

      六、Javascript函數(shù):escape()

      好了,到此為止,四種情況都說完了。

      假定前面你都看懂了,那么此時你應(yīng)該會感到很頭痛。因為,實在太混亂了。不同的操作系統(tǒng)、不同的瀏覽器、不同的網(wǎng)頁字符集,將導(dǎo)致完全不同的編碼結(jié)果。如果程序員要把每一種結(jié)果都考慮進去,是不是太恐怖了?有沒有辦法,能夠保證客戶端只用一種編碼方法向服務(wù)器發(fā)出請求?

      回答是有的,就是使用Javascript先對URL編碼,然后再向服務(wù)器提交,不要給瀏覽器插手的機會。因為Javascript的輸出總是一致的,所以就保證了服務(wù)器得到的數(shù)據(jù)是格式統(tǒng)一的。

      Javascript語言用于編碼的函數(shù),一共有三個,最古老的一個就是escape()。雖然這個函數(shù)現(xiàn)在已經(jīng)不提倡使用了,但是由于歷史原因,很多地方還在使用它,所以有必要先從它講起。

      實際上,escape()不能直接用于URL編碼,它的真正作用是返回一個字符的Unicode編碼值。比如“春節(jié)”的返回結(jié)果是%u6625%u8282,也就是說在Unicode字符集中,“春”是第6625個(十六進制)字符,“節(jié)”是第8282個(十六進制)字符。

       

      它的具體規(guī)則是,除了ASCII字母、數(shù)字、標(biāo)點符號“@ * _ + - . /”以外,對其他所有字符進行編碼。在\u0000到\u00ff之間的符號被轉(zhuǎn)成%xx的形式,其余符號被轉(zhuǎn)成%uxxxx的形式。對應(yīng)的解碼函數(shù)是unescape()。

      所以,“Hello World”的escape()編碼就是“Hello%20World”。因為空格的Unicode值是20(十六進制)。

       

      還有兩個地方需要注意。

      首先,無論網(wǎng)頁的原始編碼是什么,一旦被Javascript編碼,就都變?yōu)閡nicode字符。也就是說,Javascipt函數(shù)的輸入和輸出,默認(rèn)都是Unicode字符。這一點對下面兩個函數(shù)也適用。

       

      其次,escape()不對“+”編碼。但是我們知道,網(wǎng)頁在提交表單的時候,如果有空格,則會被轉(zhuǎn)化為+字符。服務(wù)器處理數(shù)據(jù)的時候,會把+號處理成空格。所以,使用的時候要小心。

      七、Javascript函數(shù):encodeURI()

      encodeURI()是Javascript中真正用來對URL編碼的函數(shù)。

      它著眼于對整個URL進行編碼,因此除了常見的符號以外,對其他一些在網(wǎng)址中有特殊含義的符號“; / ? : @ & = + $ , #”,也不進行編碼。編碼后,它輸出符號的utf-8形式,并且在每個字節(jié)前加上%。

       

      它對應(yīng)的解碼函數(shù)是decodeURI()。

       

      需要注意的是,它不對單引號'編碼。

      八、Javascript函數(shù):encodeURIComponent()

      最后一個Javascript編碼函數(shù)是encodeURIComponent()。與encodeURI()的區(qū)別是,它用于對URL的組成部分進行個別編碼,而不用于對整個URL進行編碼。

      因此,“; / ? : @ & = + $ , #”,這些在encodeURI()中不被編碼的符號,在encodeURIComponent()中統(tǒng)統(tǒng)會被編碼。至于具體的編碼方法,兩者是一樣。

       

      它對應(yīng)的解碼函數(shù)是decodeURIComponent()。

      posted @ 2015-09-30 09:37  nd  閱讀(2084)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 中文字幕国产在线精品| 99在线精品视频观看免费| 伊人久久久av老熟妇色| 久久久欧美国产精品人妻噜噜| 白山市| 99国产精品一区二区蜜臀| 日韩精品区一区二区三vr| 中国china露脸自拍性hd| 福利网午夜视频一区二区| 国产精品免费中文字幕| 麻豆人人妻人人妻人人片av| 夜爽8888视频在线观看| 蜜臀视频在线观看一区二区| 五月婷婷开心中文字幕| 亚洲精品无码成人A片九色播放| 人人妻人人妻人人片色av| 99久re热视频这里只有精品6| 亚洲女初尝黑人巨| 亚洲av第一区二区三区| 亚洲欧美牲交| 美女18禁一区二区三区视频| 熟女亚洲综合精品伊人久久 | 中文字幕av日韩有码| 亚洲欧洲美洲在线观看| 国产伦一区二区三区久久| 久久99精品久久久久久9| 激情综合一区二区三区| 懂色AV| 大地资源免费视频观看| 色av永久无码影院av| 午夜爽爽爽男女免费观看影院| 日韩不卡1卡2卡三卡网站| 久久久久免费看成人影片| 亚洲精品久久麻豆蜜桃| 中文字幕第55页一区| 98精品全国免费观看视频| 精品亚洲国产成人av在线| 国产99在线 | 免费| 国产亚洲精品岁国产精品| 中文字幕精品亚洲二区| 四虎国产精品永久在线|