[ActionScript 3.0] URLエンコードの要注意点

2011 年 7 月 16 日 Categories: ActionScript 3.0, ウェブ | Tags:

【修正】encodeURIComponent()の変換されない文字列を思いきり間違えていたので修正

ActionScript 3.0でURLエンコードするには複数の方法があり、しかもそのそれぞれが微妙に機能が異なる。

基本的に、encodeURI(), encodeURIComponent(), flash.utils.escapeMultiByte(), escape()の四つがある。

いずれも単純な英数字は変換されないが、変換される記号やエンコード方式に一部差異がある。

文字コード 変換されない文字
encodeURI() UTF-8 ; / ? : @ & = + $ , #
– _ . ! ~ * ‘ ( )
encodeURIComponent() UTF-8 – _ . ! ~ * ‘ ( )

escape() Unicode @ – _ . * + /
escapeMultiByte() System.useCodePageによる なし
			var str:String = "アドビ システムズ 株式会社 adobe systems ; / ? : @ & = + $ , #  - _ . ! ~ * ' ( )  @ - _ . * + /";
			trace(encodeURI(str));
			trace(encodeURIComponent(str));
			trace(escape(str));
			trace(escapeMultiByte(str));
			
			/* result
				%E3%82%A2%E3%83%89%E3%83%93%20%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%BA%20%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%20adobe%20systems%20;%20/%20?%20:%20@%20&%20=%20+%20$%20,%20#%20%20-%20_%20.%20!%20~%20*%20'%20(%20)%20%20@%20-%20_%20.%20*%20+%20/
				%E3%82%A2%E3%83%89%E3%83%93%20%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%BA%20%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%20adobe%20systems%20%3B%20%2F%20%3F%20%3A%20%40%20%26%20%3D%20%2B%20%24%20%2C%20%23%20%20-%20_%20.%20!%20~%20*%20'%20(%20)%20%20%40%20-%20_%20.%20*%20%2B%20%2F
				%u30A2%u30C9%u30D3%20%u30B7%u30B9%u30C6%u30E0%u30BA%20%u682A%u5F0F%u4F1A%u793E%20adobe%20systems%20%3B%20/%20%3F%20%3A%20@%20%26%20%3D%20+%20%24%20%2C%20%23%20%20-%20_%20.%20%21%20%7E%20*%20%27%20%28%20%29%20%20@%20-%20_%20.%20*%20+%20/
				%E3%82%A2%E3%83%89%E3%83%93%20%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%BA%20%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%20adobe%20systems%20%3B%20%2F%20%3F%20%3A%20%40%20%26%20%3D%20%2B%20%24%20%2C%20%23%20%20%2D%20%5F%20%2E%20%21%20%7E%20%2A%20%27%20%28%20%29%20%20%40%20%2D%20%5F%20%2E%20%2A%20%2B%20%2F
			*/

備考

  • encodeURI()とencodeURIComponentは、変換されない記号に違いがあるのみ
  • escapeMultiByte()はデフォルトならばUTF-8だが、encodeURI()などとは異なり、すべての記号が変換される
  • escape()はUnicodeで変換されるので、他とはまったく別物
  • たとえばアマゾンのProduct Adversiting APIでは、すべての値をUTF-8でURLエンコードする必要があるので、普通はescapeMultiByte()を使うと覚えておこう