web-dev-qa-db-ja.com

Googleでblobエンコーディングを指定するChrome

次のコード(ベンダー正規化)は完全に正常に機能し、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);
12
Eli Grey

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","");
10
panzi

問題は、Chromeの新しいタブのデフォルトのページエンコーディングです。新しいウィンドウが開いたら(window.open(url)の後)、ChromeメニューからView> Encoding> Unicodeを選択します。これにより、表示されるテキストが「➀âžâž、Test」から「 ➀➁➂テスト」Chrome 13。

デフォルトのエンコーディングに関係なく新しいウィンドウでBLOBを開くことができるソリューションが必要な場合は、iframe内のドキュメントが、独自のエンコーディングを明示的に指定していない場合、親ドキュメントのエンコーディングを継承するという事実に頼ることができます。したがって、Content-Type:text/html; charset=utf-8ヘッダーが付いた空白のHTMLドキュメントでウィンドウを開き、src属性をblobURLに設定してiframeを本文に追加できます。

0
Matthew