訳の正確性を保証するものではありませんので必要に応じて原文であるEcma InternationalのECMA-262にある ECMA-262.pdf ( ECMA-262 5.1 Edition )を参照下さい。
訳:2012年04月 webzoit.net
Uniform Resource Identifiers(URI)や URIsは、リソース(例:ウェブページやファイル)を識別する文字列であり、インターネット上でそれら(例:HTTPやFTP)にアクセスすることによる転送手続きです。 ECMAScript言語それ自身は、 15.1.3.1、15.1.3.2、15.1.3.3、15.1.3.4で説明したようにURIsを encode したり、 decode する関数を除き、URIs を使用するにあたり、いかなるサポートも提供しません。
[注釈] 多くのECMAScriptの実装は、ウェブページを操作するオプションの関数とメソッドを提供します。 これらの関数は、この標準の範囲を超えています。
URIは、コンポーネントセパレータによって分割されたコンポーネントの並びで構成されます。 一般的な書式は、
Scheme : First / Second ; Third ? Fourth
でイタリック体の名称は、コンポーネントを表し、 ":" 、 "/" 、 ";" 、 "?" は、区切り(セパレータ)として使用される予約文字です。 encodeURI と decodeURI 関数は、完全なURIsを伴って動作することが意図されます。 URIにある一部の予約文字であると仮定されるそれらは、特別な意味を持つことが意図されるので符号化されません。 encodeURIComponent と decodeURIComponent 関数は、URIの個別のコンポーネントの部品を伴って動作することが意図されます。 当該コンポーネントが完全なURIの一部である場合、一部の予約文字は、テキストを表すものと仮定し、予約文字として解釈されない為、符号化されなければなりません。 次の語彙的な文法は、符号化したURIsの書式を指定します。
【構文】 uri ::: uriCharactersopt uriCharacters ::: uriCharacter uriCharactersopt uriCharacter ::: uriReserved uriUnescaped uriEscaped uriReserved ::: ; / ? : @ & = + $ , の内の1つ uriUnescaped ::: uriAlpha DecimalDigit uriMark uriEscaped ::: % HexDigit HexDigit uriAlpha ::: 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 の内の1つ uriMark ::: - _ . ! ~ * ' ( ) の内の1つ
[注釈] 上記の構文は、RFC 2396 に基づいており、直近の RFC 3986 によって導入された変更への影響はありません。
URIに含まれる文字が、上記に列挙されない場合、または、予約文字に与えられるある特別な意味を持つことを意図しない場合、その文字は、符号化されなければいけません。
文字は、コードポイント値が一致する UTF-16 から最初に変換したサロゲートペア( Unicode仕様化当初において予想外の収録可能文字数の不足を補う一環としてUnicode未定義領域の2文字で1文字として表現することとし、固定長UTF-16と互換性を持たせた拡張 )を伴い、その UTF-8 エンコード方式に変換されます。 (範囲[0,127]にあるコードユニットにおける注釈としては、これは、同じ値を伴う1つのオクテット(1オクテット = 8ビット)内での結果となります。) 結果となるオクテットの並びは、その場合、"%xx"から成るエスケープシーケンスによって表したそれぞれのオクテットを伴う文字列に変換されます。
エンコード方式とエスケープ処理は、2つの文字列の引数 string と unescapedSetを取って抽象操作Encodeによって説明されます。
1. strLen は、string にある文字数とする 2. R は、カラの文字列とする 3. k は、0とする 4.繰り返す a. k が、 strLenと同等である場合、 R を返す b. C は、 string 内の 位置 k にある文字とする c. C が、unescapedSet内にある場合、 i. S は、文字 C だけに含まれる文字列とする ii. R は、 R と S の前の値を連結することによって算出した新たな文字列値とする d.それ以外の場合、 C は、unescapedSetに存在せず、 i. C のコードユニット値が、 0xDC00 より小さくなく、 0xDFFFよりも大きくない場合、URIError例外を投げる(スローする) ii. C のコードユニット値が、 0xD800 よりも小さいか、または、 0xDBFFよりも大きい場合、 1. V は、C のコードユニット値とする iii.それ以外の場合、 1. k を 1で増分する 2. k が、strLenである場合、URIError例外を投げる(スローする) 3. kChar は、 string 内の位置 k にある文字のコードユニット値とする 4. kChar が、 0xDC00 よりも小さいか、または、 0xDFFF よりも大きい場合、URIError例外を投げる(スローする) 5. V は、 (((C のコードユニット値) - 0xD800) x 0x400 + (kChar - 0xDC00) + 0x10000) とする iv. Octets は、 UTF-8 変換を適用することによる結果であるオクテットの配列とし、 L は、配列のサイズとする v. j は、 0 とする vi. while j < L (のループを)繰り返す 1. jOctet は、Octets 内の 位置 j にある値とする 2. S は、XYが、 jOctet の16進数エンコード方式の値である2つの大文字である場合、 "%XY" という3文字を含む文字列とする 3. R は、 R と S の前の値を連結することによって算出した新たな文字列値とする 4. j を1で増分する e. k を 1で増分する
復号・復号化(unescaping)と解読(decoding)処理は、2つの文字列の引数 string と reservedSet を取る抽象操作Decodeによって説明されます。
1. strLen は、 stringにある文字数とする 2. R は、カラの文字列とする 3. k は、0とする 4.繰り返す a. k が、 strLenと同等である場合、 Rを返す b. C は、string 内の位置 k にある文字とする c. C が、'%'ではない場合、 i. S は、文字 C にのみ含まれる文字列とする d.それ以外の場合、 C は、'%'であり、 i. start は、 kとする ii. k + 2 が、 strLen よりも大きいか等しい場合、URIError例外を投げる(スローする) iii. string内の 位置 (k + 1) と (k + 2) にある文字が、16進数字を表さない場合、URIError例外を投げる(スローする) iv. B は、 位置 (k + 1) と (k + 2) にある2つの16進数字によって表した 8ビットの値とする v. k を 2で増分する vi. Bにある最大有効ビットが、0である場合、 1. C は、コードユニット値 B を伴う文字とする 2. C が、reservedSetではない場合、 S は、文字 C にのみ含まれる文字列とする 3. それ以外の場合、 C は、reservedSet内にあり、 a S は、位置 start から k が含まれる位置までの string における部分文字列とする vii.それ以外の場合、B にある最大有効ビットは、1であり、 1. n は、 (B << n) & 0x80 が 0 と等価であるような最小の非負数とする 2. n が、1または、nが、4より大きい場合、URIError例外を投げる(スローする) 3. Octets は、サイズ n の8ビットの整数から成る配列とする 4.位置 0 にある(配列) Octets に Bを入れる 5. k + (3 x (n - 1)) が、 strLenより大きいか、等しい場合、URIError例外を投げる(スローする) 6. j は、 1とする 7. while j < n (の条件下で)繰り返す a kを1で増分する b 位置 kにある文字が'%'ではない場合、URIError例外を投げる(スローする) c string内の位置 (k + 1) と (k + 2) にある文字が、16進数字を表さない場合、URIError例外を投げる(スローする) d Bは、位置 (k + 1) と (k + 2) にある2つの16進数字によって表した 8ビットの値とする e Bにある2つの最大有効ビットが、10ではない場合、URIError例外を投げる(スローする) f k を 2で増分する g 位置 j にある(配列) Octets に B を入れる h j を1で増分する 8. V は、 Octetsに UTF-8 変換を適用することによって得られた値とし、それは21ビット値におけるオクテットの配列から成る、Octetsが、Unicodeコードポイントの有効な UTF-8 エンコード方式を含まない場合、URIError例外を投げる(スローする) 9. V が、 0x10000よりも小さい場合、 a C は、コードユニット値 V を伴う文字とする b C が、reservedSet内に存在しない場合、 i. S は、文字 C にのみ含まれる文字列とする c それ以外の場合、 C は、reservedSet内に存在し、 i. S は、位置 start から k が含まれる位置までの文字列の部分文字列とする 10.それ以外の場合、 V は、≧ 0x10000 であり、 a L は、 (((V - 0x10000) & 0x3FF) + 0xDC00) とする b H は、 ((((V - 0x10000) >> 10) & 0x3FF) + 0xD800) とする c S は、 コードユニット値 H と L を伴う2つの文字を含む文字列とする e. R は、R と S の前の値を連結することによって算出した新たな文字列値とする f. k を 1で増分する
[注釈] このUniform Resource Identifiersの構文は、 RFC 2396 を基準としており、 RFC 2396 に置き換わる直近の RFC 3986 への影響はありません。 UTF-8 における正規の説明と実装は、 RFC 3629 でなされます。 UTF-8 では、文字は、1から6までのオクテットの並びを使って符号化されます。 1つの"sequence"(「並び」)から成るオクテットに限っては、上位ビットが0に設定され、残りの7ビットは文字の値を符号化する為に使用されます。 n オクテットの並びにおける n > 1 は、最初のオクテットは、上位の n ビットが1に設定され、0に設定されたビットによって続きます。 そのオクテットの残りのビットは、符号化される文字の値から成るビットを含みます。 次のオクテットの全ては、上位のビットが1、次のビットは0に設定され、残りの6ビットは、それぞれの中に符号化される文字から成るビットを含みます ECMAScriptの文字において利用可能なUTF-8エンコード方式は、Table 21で指定されます。
Table 21 -- UTF-8 エンコード方式 ------------------------------------------------------------------------------------------------------------ コードユニット値 表示 1番めのOctet 2番めのOctet 3番めのOctet 4番めのOctet ------------------------------------------------------------------------------------------------------------ 0x0000 - 0x007F 00000000 0zzzzzzz 0zzzzzzz ------------------------------------------------------------------------------------------------------------ 0x0080 - 0x07FF 00000yyy yyzzzzzz 110yyyyy 10zzzzzz ------------------------------------------------------------------------------------------------------------ 0x0800 - 0xD7FF xxxxyyyy yyzzzzzz 1110xxxx 10yyyyyy 10zzzzzz ------------------------------------------------------------------------------------------------------------ 0xD800 - 0xDBFF 110110vv vvwwwwxx 11110uuu 10uuwwww 10xxyyyy 10zzzzzz に以下が続く に以下が続く 0xDC00 - 0xDFFF 110111yy yyzzzzzz ------------------------------------------------------------------------------------------------------------ 0xD800 - 0xDBFF に以下が続かない URIErrorを引き起こす 0xDC00 - 0xDFFF ------------------------------------------------------------------------------------------------------------ 0xDC00 - 0xDFFF URIErrorを引き起こす ------------------------------------------------------------------------------------------------------------ 0xE000 - 0xFFFF xxxxyyyy yyzzzzzz 1110xxxx 10yyyyyy 10zzzzzz ------------------------------------------------------------------------------------------------------------
以下の
uuuuu = vvvv + 1
は、Unicode標準規格のセクション 3.7 サロゲート内にあるように 0x10000 として追加する為のアカウントの場所です。
コードユニット値の範囲 0xD800-0xDFFF は、サロゲートペアを符号化する為に使用されます。 上記変換は、 UTF-32 表現について UTF-16 のサロゲートペアを結合し、 UTF-8 にある 21ビット値を結果として符号化します。 解読(Decoding)は、サロゲートペアを再構築します。 RFC 3629 は、有効な UTF-8 オクテットシーケンスの解読を禁止しています。 例えば、有効な並び C0 80 は、文字 U+0000 を解読(デコード)してはいけません。 デコードアルゴリズムの実装は、このように有効な並びに遭遇する場合、URIErrorを投げる(スローする)ことを要求されます。
decodeURI関数は、それが表す文字を伴って置換されるencodeURI関数によって導入される場合があるソート済みのエスケープシーケンスと UTF-8 エンコード方式ごとにURIの新たなバージョンを算出します。 encodeURIによって導入されていないエスケープシーケンスは、置換されません。 decodeURI関数が、1つの引数encodedURIを伴って呼ばれる場合、次のステップが取られます。
1. uriString は、 ToString(encodedURI) とする 2. reservedURISet は、"#"を加えた uriReserved 内にある有効な文字ごとの1つのインスタンスを含む文字列とする 3. Decode(uriString, reservedURISet) を呼んだ結果を返す
[注釈] 文字"#"は、予約済みURI文字ではありませんが、エスケープシーケンスから解読(デコード)されることはありません。
decodeURIComponent関数は、それが表す文字を伴って置換されるencodeURIComponentによって導入される場合があるソート済みのエスケープシーケンスと UTF-8 エンコード方式ごとにURIの新たなバージョンを算出します。 decodeURIComponent関数が1つの引数encodedURIComponentを伴って呼ばれる場合、次のステップが取られます。
1. componentString は、 ToString(encodedURIComponent) とする 2. reservedURIComponentSet は、カラの文字列とする 3. Decode(componentString, reservedURIComponentSet)を呼んだ結果を返す
encodeURI関数は、文字の UTF-8 エンコード方式を表す1つ、2つ、3つまたは4つのエスケープシーケンスによって置換される特定の文字のインスタンスごとに新たなURIのバージョンを算出します。 encodeURI関数が、1つの引数 uri を伴って呼ばれる場合、次のステップが取られます。
1. uriString は、 ToString(uri) とする 2. unescapedURISet は、"#"を加えた uriReserved と uriUnescaped内にある有効な文字ごとのインスタンスを1つ含むStringとする 3. Encode(uriString, unescapedURISet) を呼んだ結果を返す
[注釈] 文字"#"は、予約済みまたは、復号・復号化(アンエスケープ)されたURI文字ではありませんが、エスケープシーケンスに符号化(エンコード)されることはありません。
encodeURIComponent関数は、文字の UTF-8 エンコード方式を表す1つ、2つ、3つまたは4つのエスケープシーケンスによって置換される特定の文字のインスタンスごとに新たなURIのバージョンを算出します。 encodeURIComponent関数が、1つの引数 uriComponent を伴って呼ばれる場合、次のステップが取られます。
1. componentString は、 ToString(uriComponent) とする 2. unescapedURIComponentSet は、uriUnescaped にある有効な文字ごとのインスタンスを1つ含むStringとする 3.Encode(componentString, unescapedURIComponentSet)を呼んだ結果を返す