次のコード(ベンダー正規化)は完全に正常に機能し、Firefox 8では「➀➁➂テスト」と表示されますが、GoogleChromeでは「➀âžâž、テスト」と表示されます。ファイルシステムAPIを使用して一時ファイルシステムにファイルを書き込む以外に、Google Chromeでblobのエンコーディングを保持する方法はありますか?
var b = new Blob(["➀➁➂ Test"], {type: "text/plain;charset=UTF-8"});
var url = URL.createObjectURL(b);
open(url);
Gecko(Firefox)、WebKit(Safari、Chrome)、およびOperaは、base64で文字列をエンコードするための非標準のbtoa
関数をサポートします。base64文字列を取得するためUTF-8としてエンコードされた文字列を含む場合は、encodeURIComponent
-unescape
トリックを使用する必要があります。encodeURIComponent
は文字列をUTF-8URLとしてエンコードしますが、unescape
はデコードします各%xx
を1文字として。btoa
は、必要なエンコーディングのバイナリ文字列を想定しています。
var base64 = btoa(unescape(encodeURIComponent(data)));
window.open("data:text/plain;charset=UTF-8;base64,"+base64,"UTF-8 Text");
もちろん、これはIEでは機能しませんが、IE 10はBlob
- APIをサポートすると思います。エンコーディングの処理方法は誰にもわかりません。
PS:IE window.open
data:-urlsができないようで、とにかくとんでもない小さなURL長の制限があります。
PPS:これはChromeで機能します:
var b = new Blob(["➀➁➂ Test"],{encoding:"UTF-8",type:"text/plain;charset=UTF-8"});
var url = URL.createObjectURL(b);
window.open(url,"_blank","");
問題は、Chromeの新しいタブのデフォルトのページエンコーディングです。新しいウィンドウが開いたら(window.open(url)
の後)、ChromeメニューからView> Encoding> Unicodeを選択します。これにより、表示されるテキストが「➀âžâž、Test」から「 ➀➁➂テスト」Chrome 13。
デフォルトのエンコーディングに関係なく新しいウィンドウでBLOBを開くことができるソリューションが必要な場合は、iframe内のドキュメントが、独自のエンコーディングを明示的に指定していない場合、親ドキュメントのエンコーディングを継承するという事実に頼ることができます。したがって、Content-Type:text/html; charset=utf-8
ヘッダーが付いた空白のHTMLドキュメントでウィンドウを開き、src
属性をblobURLに設定してiframeを本文に追加できます。