encodeURI() 関数は、URI (Uniform Resource Identifier; 統一資源識別子) をエンコードし、各文字のインスタンスをそれぞれ UTF-8 符号の文字を表す 1 個から 4 個のエスケープシーケンスに置き換えます (サロゲート文字のペアのみ 4 個のエスケープシーケンスになります)。

構文

encodeURI(URI)

引数

URI
完全な URI。

戻り値

特定の文字がエスケープされた新しい文字列。

説明

URI において特別な意味を持つ予約文字はエンコードされません。下記の例はURI "scheme" に含まれるかもしれない全ての箇所を示しています。特定文字がどういう役割で使用されるかに注意してください。

http://username:password@www.example.com:80/path/to/file.php?foo=316&bar=this+has+spaces#anchor

encodeURI は完全な URI を想定しているため、URI において特別な意味を持つ予約文字はエンコードされません。また、encodeURI は "unreserved marks"(予約されていないが "そのまま" URIに使用できる)文字をエンコードしません。(RFC2396を確認してください。)

encodeURI は下記を除く全ての文字をエスケープします。

エスケープされない文字: A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #

encodeURIComponent はこれらの文字をエンコードします。

var set1 = ";,/?:@&=+$#";  // Reserved Characters
var set2 = "-_.!~*'()";   // Unreserved Marks
var set3 = "ABC abc 123"; // Alphanumeric Characters + Space

console.log(encodeURI(set1)); // ;,/?:@&=+$#
console.log(encodeURI(set2)); // -_.!~*'()
console.log(encodeURI(set3)); // ABC%20abc%20123 (the space gets encoded as %20)

console.log(encodeURIComponent(set1)); // %3B%2C%2F%3F%3A%40%26%3D%2B%24%23
console.log(encodeURIComponent(set2)); // -_.!~*'()
console.log(encodeURIComponent(set3)); // ABC%20abc%20123 (the space gets encoded as %20)

サロゲートペアになっていない 1 個のサロゲート文字をエンコードしようとすると URIError が発生することに注意してください。例えば、

// サロゲートペアは OK
console.log(encodeURIComponent('\uD800\uDFFF'));

// 上位サロゲートのみだと "URIError: malformed URI sequence" エラーが発生
console.log(encodeURIComponent('\uD800'));

// 下位サロゲートのみだと "URIError: malformed URI sequence" エラーが発生
console.log(encodeURIComponent('\uDFFF'));

encodeURI のみでは適切なHTTPのGET・POSTリクエストを作成できないことに注意してください。なぜなら、"&"・"+"・"=" はGET・POSTリクエストにおいて特別な文字であり、それらがエンコードされていないからです。encodeURIComponentの場合、それらはエンコードされます。

サロゲートペアになっていない 1 個のサロゲート文字をエンコードしようとすると URIError が発生することに注意してください。例えば、

// サロゲートペアは OK
console.log(encodeURI('\uD800\uDFFF'));

// 上位サロゲートのみだと "URIError: malformed URI sequence" エラーが発生
console.log(encodeURI('\uD800'));

// 下位サロゲートのみだと "URIError: malformed URI sequence" エラーが発生
console.log(encodeURI('\uDFFF')); 

また、URL 記述のための最近の RFC3986 仕様に従いたい場合、角括弧 [] は (IPv6 用の) 予約文字となっているため、角括弧が (ホスト名など) URL の一部を形成している場合はエンコードされていないほうがよいでしょう。そういう場合は以下のコードが役に立ちます:

function fixedEncodeURI (str) {
    return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
}

代わりのURIエンコーディングにはBase62xがあり、それはNPMに移植されています。

仕様

仕様 策定状況 コメント
ECMAScript 3rd Edition (ECMA-262) 標準 初期定義。
ECMAScript 5.1 (ECMA-262)
encodeURI の定義
標準  
ECMAScript 2015 (6th Edition, ECMA-262)
encodeURI の定義
標準  
ECMAScript Latest Draft (ECMA-262)
encodeURI の定義
ドラフト  

ブラウザ実装状況

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応 あり あり1 あり あり あり
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応 あり あり あり4 あり あり あり

関連情報

ドキュメントのタグと貢献者

タグ: 
このページの貢献者: segayuu, YuichiNukiyama, Marsf, dskmori, x2357, teoli, ethertank, Potappo
最終更新者: segayuu,