2013-05-25 10 views
8

進化する仕様を読んでから、私はRFC 3986が最終的にエスケープオクテットシーケンスのためのUTF-8エンコーディングに定住したと仮定していました。つまり、私のURIが%XX%YY%ZZならば、デコードされたオクテットのシーケンス(スキーム固有の部分のURI)を取得し、結果のバイトをUTF-8として解釈して、デコードされた情報が意図されたものかどうかを調べることができます。実際には、私はこのコードを自動的に私のために行うJavaScript decodeURIComponent()を呼び出すことができます。データのURIの文字セット

そしてIは、(自然に)符号化されたデータの文字セットを示しcharset引数を含むdata:のURI、RFC 2397、の仕様を読み取ります。しかし、それはどのように機能しますか?もし私が2八重奏でエンコードされた配列%XX%YYが私のdata: URIにあるならば、charset=iso-8859-1は、ではなく、がUTF-8シーケンスとして解釈されるべきであることを示しています.ISOの各バイト-8859-1は文字を表します)? RFC 2397は、それが「ギリシャの[sic]文字」の一例与えるので、これを示すようだ:

data:text/plain;charset=iso-8859-7,%be%fg%be 

をしかし、これは(UTF-8でエンコードされたオクテットを想定)のJavaScript decodeURIComponent()を抽出するために使用することができないことを意味しますデータURIからの文字列、正しい?これは、charsetがUTF-8以外のものであれば、データURIの独自のデコードを作成する必要があることを意味しますか?

これは、RFC 2397が現在RFC 3986と競合していることを意味しますか?UTF-8が想定されているようです。あるいは、RFC 3986は、 "新しいURIスキーム"を参照するだけです。すなわち、data: URIスキームが盛り込まれ、エンコードされたオクテットが何を意味するのかを指定する独自のテクニックがあります。

現時点では、data:は独自のルールで再生され、UTF-8以外の文字セットを示す場合は、JavaScriptでdecodeURIComponent()以外のものを使用する必要があります。交換方法に関する推奨事項も歓迎されます。

答えて

5

data: URIスキームは、それがhttp: URIただけであるかのように不透明なバイトストリームで構成されたファイルであると考える(同じバイトストリームが、HTTPサーバーに格納されている)ことができるリソースを記述することを忘れないでくださいまたはftp: URI(同じバイトストリームですが、FTPサーバーに格納されます)またはfile: URI(同じバイトストリームですが、ローカルファイルシステムに格納されています)。ファイルに添付されたメタデータのみがバイトストリームの意味を与えます。

RFC 2397では、このバイトストリームがURI自体にどのように埋め込まれるべきかについて明確な仕様が与えられています(他のURIスキームとは対照的に、URIには何が含まれているのではなく、バイトストリームをどこで取得するかについての指示があります)。これはbase64でもかまいませんし、RFCで与えられたパーセント符号化方式かもしれません。 bytestreamにman以外のASCIIバイトが含まれていると、Base64の方がコンパクトになります。

また、data: URIは、独自のContent-Typeを記述します。これは、バイトストリームの意図された解釈を示します。この場合、text/plain;charset=iso-8859-7を使用しているため、バイトはISO-8859-7テキストで正しくエンコードされている必要があります。バイトは、確かにではなく、UTF-8または他の文字エンコードとして決定されます。あなたが指定した文字エンコーディングを使用して明白にデコードされます。