人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

html5-FileAPIで2バイト文字CSV出力

下記の様にHTML5-FileAPIでCSVを出力ダウンロードさせているのですが
2バイト文字がUNICODEで出力され、直接Excelを開くと化けてしまいます。

ExcelがSJISなためで、javascript側で変換しようとしてもうまくいきません
(encoding.js使用)

文字化けせず直接CSVを開けるようにできないでしょうか
(あくまでjavascript側だけで解決させたい)


for(i=0;i<data_json.length;i++){
content = content + data_json[i].Index_name + ',';
//content = content + Encoding.convert(content, 'SJIS', 'AUTO') + ',';
//改行
content = content + '\r\n';
}

// 指定されたデータを保持するBlobを作成する。
var blob = new Blob([ content ], { "type" : "text/plain" });

// Aタグのhref属性にBlobオブジェクトを設定し、リンクを生成
window.URL = window.URL || window.webkitURL;
$("#" + id).attr("href", window.URL.createObjectURL(blob));
$("#" + id).attr("download", "test.csv");

●質問者: 匿名質問者
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● 匿名回答1号

文字コード変換部分はコメントアウトされてるようですが、
ループ内で重複して変換されてしまっているように見えます。

for(i=0;i<data_json.length;i++){
content = content + data_json[i].Index_name + ',';
//改行
content = content + '\r\n';
}

// フォーマット後にデータ全体を文字コード変換
content = Encoding.convert(content, 'SJIS', 'AUTO');

この位置で変換をしてみてはどうでしょうか


匿名質問者さんのコメント
ご回答ありがとうございます 私のソース転記ミスでした for(i=0;i<data_json.length;i++){ temp = data_json[i].Index_name + ','; content = content + Encoding.convert(temp, 'SJIS', 'AUTO') + ','; //改行 content = content + '\r\n'; } // 指定されたデータを保持するBlobを作成する。 var blob = new Blob([ content ], { "type" : "text/plain" }); // Aタグのhref属性にBlobオブジェクトを設定し、リンクを生成 window.URL = window.URL || window.webkitURL; $("#" + id).attr("href", window.URL.createObjectURL(blob)); $("#" + id).attr("download", "test.csv");

2 ● 匿名回答3号
ベストアンサー

回答のために,専用の記事を執筆しました。

動作デモも作っておきました。


JavaScript/HTML5で,SJISの日本語CSVファイルをWebページ上で動的に生成してダウンロードするサンプルコードと解説
(動作デモ付き。Excelで開いても文字化けしない)
http://d.hatena.ne.jp/TipsMemo+computer-technology/20150710/p2


↑この解説にも書きましたが,質問内容に記載されているコードが動かない理由は:

(1)Encoding.convertに渡すデータは,文字列ではなく,文字コードの配列である。

(2)convertから返却されるのも,やはり文字コードの配列である。

(3)new Blobに渡すデータは,変換後の文字データではなく,Uint8Arrayである。

この3点です。

どうぞご確認ください。


匿名質問者さんのコメント
ご回答ありがとうございます 記事を参照させて頂き無事稼働確認できました。 encoding.shのサンプルを見て、文字列ではなく文字コード配列を渡す という所までは分かったのですが、どうやってコードを生成?と悩んでおりました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ