flash as2/as3 向后台傳參數url編碼 urlencode(解決中文傳參亂碼問題)
flash as2中:
getURL("input.aspx?type="+ "中文", "_blank");
這樣的做法時常會遇到后台無法正確解析這里所謂字符串“中文”現象,而用escape()將參數轉成url編碼的格式,問題就解決了
getURL("input.aspx?type="+escape("中文"), "_blank");
flash as3中:
用encodeURI()
flash AS3中的urlencode函數與javascript中的ulrencode函數是一樣的,分別是escape、encodeURI、encodeURIComponent三個函數。我們看下面一段例子:
ActionScript 3:
var a:String = "超越夢想#";
trace(escape(a)); //%u8D85%u8D8A%u68A6%u60F3%23
trace(encodeURI(a)); //%E8%B6%85%E8%B6%8A%E6%A2%A6%E6%83%B3#
trace(encodeURIComponent(a)); //%E8%B6%85%E8%B6%8A%E6%A2%A6%E6%83%B3%23
JavaScript:
var a = "超越夢想#";
alert(escape(a)); //%u8D85%u8D8A%u68A6%u60F3%23
alert(encodeURI(a)); //%E8%B6%85%E8%B6%8A%E6%A2%A6%E6%83%B3#
alert(encodeURIComponent(a)); //%E8%B6%85%E8%B6%8A%E6%A2%A6%E6%83%B3%23
三個函數的的區別也和javascript的一樣,一般情況下如果你把這段字符串當作參數傳輸就用encodeURIComponent,如果你只是把一個URL中的非字母數字等字符轉化成%的形式,就用encodeURI,他們的區別就在於對於URL中的特殊字符例如 # 和 / 理解不同, 前者會轉化掉,后者會認為這是url的一部分,保留原有形式。
下面列舉AS3中三個函數的具體說明:
escape:
將參數轉換為字符串,並以 URL 編碼格式對其進行編碼,在這種格式中,大多數非字母數字的字符都替換為 % 十六進制序列。 當用於 URL 編碼的字符串時,百分號 (%) 用於引入轉義字符,不與模運算符 (%) 等效。
下表顯示不會 由 escape() 函數轉換為轉義序列的所有字符。
未編碼的字符
0 1 2 3 4 5 6 7 8 9
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
@ - _ . * + /
參數 str:String — 要轉換為字符串並以 URL 編碼格式進行編碼的表達式。
返回 String — 一個 URL 編碼的字符串。
encodeURI:
將字符串編碼為有效的 URI(統一資源標識符)。 將完整的 URI 轉換為一個字符串,其中除屬於一小組基本字符的字符外,其它所有字符都編碼為 UTF-8 轉義序列。
下表顯示不會由encodeURI函數轉換為 UTF-8 轉義序列的基本字符的整個集合。
未編碼的字符
0 1 2 3 4 5 6 7 8 9
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
; / ? : @ & = + $ , #
- _ . ! ~ * ( ) 還有單引號
參數
uri:String— 一個表示完整 URI 的字符串。
返回
String— 一個字符串,其中某些字符已編碼為 UTF-8 轉義序列。
encodeURIComponent:
將字符串編碼為有效的 URI 組件。 將 URI 的子字符串轉換為以下字符串:除屬於非常小的一組基本字符的字符外,其它所有字符都編碼為 UTF-8 轉義序列。
encodeURIComponent()函數與encodeURI()函數不同,它僅適用於 URI 字符串的一部分(稱為 URI 組件)。 URI 組件是指出現在某些特殊字符之間的任何文本,這些特殊字符稱為組件分隔符(: / ; and ?). “http”和“www.adobe.com”是常見的 URI 組件示例。
此函數與encodeURI()的另一個重要區別是:由於此函數假定它處理的是 URI 組件,因此它會將特殊分隔符字符 (; / ? : @ & = + $ , #) 視為應進行編碼的常規文本。
下表顯示不會由encodeURIComponent函數轉換為 UTF-8 轉義序列的所有字符。
未編碼的字符
0 1 2 3 4 5 6 7 8 9
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
- _ . ! ~ * ( ) 還有單引號
參數
uri:String
返回
String
AS3中的encodeURI,encodeURIComponent,decodeURI以及decodeURIComponent
在ActionScript 3中,除了escape和unescape兩個字符串編碼和解碼函數以外,新增了encodeURI,encodeURIComponent,decodeURI,decodeURIComponent四個函數
(一)、如果你在實際項目AS2中用的是escape,而在js中用了unescape,卻始終得不到原始的值, 那么原因就是在AS2中,沒有與js的escape對應的函數,而AS2中的escape,實現的卻是其他語言中的encodeURI或URIEncode的功能,AS3中,終於把escape和encodeURI區分開來了,AS3中的encodeURI和decodeURI與AS2中的escape和unescape大體相似,但要要根據具體未編碼字符而定。例如:
在as2中:
trace(escape("超越夢想#")); //輸出:%E8%B6%85%E8%B6%8A%E6%A2%A6%E6%83%B3%23
在as3中:
trace(encodeURI("超越夢想#")); //輸出:%E8%B6%85%E8%B6%8A%E6%A2%A6%E6%83%B3#
trace(encodeURIComponent("超越夢想#")); //輸出:%E8%B6%85%E8%B6%8A%E6%A2%A6%E6%83%B3%23
(二)、AS3中的encodeURI和decodeURI與AS2中escape和unescape不一樣的地方:
在AS2中,System.useCodepage影響escape對雙字節字符編碼和解碼的結果,注意下面System.useCodepage設為true和false的時候,輸出是不同的:
System.useCodepage=true;
trace(escape("超越夢想#")); //輸出:%B3%AC%D4%BD%C3%CE%CF%EB%23
System.useCodepage=false;
trace(escape("超越夢想#")); //輸出:%E8%B6%85%E8%B6%8A%E6%A2%A6%E6%83%B3%23
在AS3中,System.useCodepage不影響decodeURI的結果,兩個結果是一樣的:
System.useCodePage = true;
trace(encodeURI("超越夢想#")); //輸出:%E8%B6%85%E8%B6%8A%E6%A2%A6%E6%83%B3#
System.useCodePage = false;
trace(encodeURI("超越夢想#")); //輸出:%E8%B6%85%E8%B6%8A%E6%A2%A6%E6%83%B3#
在AS3中,escape同樣也不受System.useCodePage的影響:
System.useCodePage = true;
trace(escape("超越夢想#")); //輸出:%u8D85%u8D8A%u68A6%u60F3%23
System.useCodePage = false;
trace(escape("超越夢想#")); //輸出:%u8D85%u8D8A%u68A6%u60F3%23
這說明在AS3中,所有運用到escape和encodeURI的地方,都不能再通過設置System.useCodePage來改變編解碼的方式,與后台或其他程序語言交互就必須考慮這個問題,以后后台編碼的時候,記得要以UTF-8編碼,否則decodeURI就會拋出URIError,提示無效的URI;