コレではまったら、サイトを見ると、
beforeSend: function(xhr){
xhr.overrideMimeType("text/html;charset=UTF-8");
},
しろと書いてある。
確かに結果的に言うと、
「このまま書くと」文字化けが消えたように「見える」
だけど、そこに落とし穴がある。
そんなことをつらつらと・・・
■お題
以下のHTMLがある。
上記のプログラムはShift-JISで書かれて、保存されている。
これを受けるPythonのプログラム(sample2.py)は、こんなかんじ。
これも、Shift-JISで書いて、保存してある。
これを、実行すると、文字化けする。
■xhr.overrideMimeTypeのcharset=Shift-JIS ”ではない”
ここで、全部Shift-JISなのだから
beforeSend: function(xhr){
xhr.overrideMimeType("text/html;charset=Shift-JIS");
},
と書くと、失敗する(変わらない)。
理由はブラウザは、引数を、UTF-8で送る。
ほかはShift-JISで書かれていても。
それで、文字化けしているのだから、
ここはShift-JISでなく,UTF-8で送っているよ!と送らねばならない。
なので、
beforeSend: function(xhr){
xhr.overrideMimeType("text/html;charset=UTF-8");
},
と書かなければならない。
まとめると、こんなかんじ。
■これで、一件落着・・・じゃない!
たしかに、上のsample2.pyは、正常に動作する.
だけど、最後の、
print data
を
print "文字列"
とかに書き換えると、文字化けする。
・・・そう、
xhr.overrideMimeType("text/html;charset=UTF-8");
って書いちゃうと、UTF-8になってしまって、いくら、python側で
print "Content-Type: text/plain;charset=Shift-JIS\n"
って送っても、だめみたい・・・
ということは、python側をすべてUTF-8にする、つまり
と書いて、UTF-8で保存すれば
送られてきたデータをそのまま返しても、また
print "文字列"
と書いても、文字化けしない。
beforeSend: function(xhr){
xhr.overrideMimeType("text/html;charset=UTF-8");
},
しろと書いてある。
確かに結果的に言うと、
「このまま書くと」文字化けが消えたように「見える」
だけど、そこに落とし穴がある。
そんなことをつらつらと・・・
■お題
以下のHTMLがある。
<HEAD> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script> <script type="text/javascript"> function senddata() { $.ajax({ url: "sample2.py", type: 'post', data:{ data:$("#pdata").val(), }, success: function(mydata){ alert(mydata); $("#pdata").val(mydata); }, error: function(XMLHttpRequest, textStatus, errorThrown){ alert("error !!!"); } }); } </script> </HEAD> <BODY> <form> <INPUT type=text name="pdata" id="pdata"/> <BUTTON onclick="senddata();return false;">実行</BUTTON> </form> </body> </html> |
上記のプログラムはShift-JISで書かれて、保存されている。
これを受けるPythonのプログラム(sample2.py)は、こんなかんじ。
|
これも、Shift-JISで書いて、保存してある。
これを、実行すると、文字化けする。
■xhr.overrideMimeTypeのcharset=Shift-JIS ”ではない”
ここで、全部Shift-JISなのだから
beforeSend: function(xhr){
xhr.overrideMimeType("text/html;charset=Shift-JIS");
},
と書くと、失敗する(変わらない)。
理由はブラウザは、引数を、UTF-8で送る。
ほかはShift-JISで書かれていても。
それで、文字化けしているのだから、
ここはShift-JISでなく,UTF-8で送っているよ!と送らねばならない。
なので、
beforeSend: function(xhr){
xhr.overrideMimeType("text/html;charset=UTF-8");
},
と書かなければならない。
まとめると、こんなかんじ。
|
■これで、一件落着・・・じゃない!
たしかに、上のsample2.pyは、正常に動作する.
だけど、最後の、
print data
を
print "文字列"
とかに書き換えると、文字化けする。
・・・そう、
xhr.overrideMimeType("text/html;charset=UTF-8");
って書いちゃうと、UTF-8になってしまって、いくら、python側で
print "Content-Type: text/plain;charset=Shift-JIS\n"
って送っても、だめみたい・・・
ということは、python側をすべてUTF-8にする、つまり
|
と書いて、UTF-8で保存すれば
送られてきたデータをそのまま返しても、また
print "文字列"
と書いても、文字化けしない。