JavaScriptでcsvファイルを読み込んでブラウザに出力したいのですが、文字化けしてしまいます。
csvはutf-8で保存しています。サーバーは、Xサーバーです。
文字化けせずにcsvファイルから読み取り、出力するにはどうすれば良いでしょうか?
test.csv 20170404,イチロー,いちご
JavaScript
1function getCSV(){ 2 var req = new XMLHttpRequest(); 3 req.open("get", "test.csv", true); 4 req.send(null); 5 6 req.onload = function(){ 7 convertCSVtoArray(req.responseText); 8 } 9} 10 11function convertCSVtoArray(str){ 12 var tmp = str.split(","); 13 alert("データ1:"+tmp[0]+"データ2:"+tmp[1]+"データ3:"+tmp[2]); 14} 15getCSV();
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/08 06:07

回答1件
0
次のようなスクリプトで実験してみました。
html
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta http-equiv="Content-Type" content="text/Shift-JIS; charset=utf-8" /> 5 <title>csv test</title> 6 <script type="text/javascript"> 7//---------- from ---------- 8function getCSV(){ 9 var req = new XMLHttpRequest(); 10 req.open("get", "test.csv", true); 11 req.send(null); 12 13 req.onload = function(){ 14 var reshdr = req.getResponseHeader("content-type") //for debug 15 console.log(reshdr) //for debug 16 convertCSVtoArray(req.responseText); 17 } 18} 19 20function convertCSVtoArray(str){ 21 var tmp = str.split(","); 22 alert("データ1:"+tmp[0]+"データ2:"+tmp[1]+"データ3:"+tmp[2]); 23} 24//---------- to ---------- 25 </script> 26</head> 27<body> 28 この行はShift-JISでエンコードしてあります。 29 <form> 30 <input type="button" value="show csv" onClick="getCSV()"> 31 </form> 32</body> 33</html>
- HTML自体はShift-JISでエンコード
- ブラウザー(firefox: テキストエンコーディングを「日本語(Shift-JIS)」「自動判別:解除」)
上記ページのボタンをクリックするとalertの内容は文字化けしていませんでした。
なお、上記javascriptでcsvファイルを受け取ったときのレスポンスヘッダーの"content-type"をコンソールに出していますが"text/csv; charset=UTF-8"となっていました。
また、サーバーはちょっといい加減なものを使っており応答の際にcharsetを無条件にutf-8にしているのですが、firefoxのテキストエンコーディングを「unicode」「自動判別:解除」にするとHTMLドキュメント上の文字列やalertの「データ1」などは文字化けしますが、受信したcsvデータ自体は文字化けしません。
つまり「サーバーから応答されたtest.csvのレスポンスがcharset=utf-8になっていないかまたはサーバー上にあるtest.csv自体がutf-8でないかのいずれかではないかと思いました。
追記:まず事実を確認してみるとよいと思います。
- server上のtest.csvはutf-8になっているか
小さなテストデータなので確認は容易だと思います。例えばlinux/unix上であれば下記と同じ結果になればutf-8であることは確実です。(通常はLANG=ja_JP.UTF-8となっている端末上でcat test.csvとして文字化けしてなければutf-8であるといった確認をするでしょうけども)
$ od -c test.csv 0000000 2 0 1 7 0 4 0 4 , 343 202 244 343 203 201 343 0000020 203 255 343 203 274 , 343 201 204 343 201 241 343 201 224 \n 0000040
- serverからtest.csvを受信した際のcharset
上述の実験コードのようにリクエストオブジェクトに対してgetResponseHeader("content-type")
メソッドの呼び出しで文字セットが確認できます。
補足しますと、自分はwebアプリケーションの知識に乏しいため、「どういう確認ができるか」を考え上記のような実験をしてみた次第です。まず上記を確認して「推測した通りの不整合がみつかったなら」その先を調査するようにしたほうがよいでしょう。サーバーからの応答のcharsetがutf-8になっていないかも知れないという推測のままで前へ進むのは時間を無駄にする可能性があると思います。
投稿2017/04/05 01:16
編集2017/04/05 20:35総合スコア18404
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。