ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

「Python+JQuery+ajaxで文字化け」ではまったこと

2015-03-20 16:52:26 | トピックス
コレではまったら、サイトを見ると、
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)は、こんなかんじ。

#!/usr/bin/python
# coding: cp932

import os.path
import cgi
import os
import sys

data="";
form = cgi.FieldStorage()
if form.has_key("data"):
data = form["data"].value

print "Content-Type: text/plain;charset=Shift-JIS\n"
print data

これも、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");
},
と書かなければならない。
まとめると、こんなかんじ。

<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(),
},
beforeSend: function(xhr){
xhr.overrideMimeType("text/html;charset=UTF-8");
},

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>





■これで、一件落着・・・じゃない!

たしかに、上の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にする、つまり

#!/usr/bin/python
# coding: utf-8

import os.path
import cgi
import os
import sys

data="";
form = cgi.FieldStorage()
if form.has_key("data"):
data = form["data"].value

print "Content-Type: text/plain;charset=utf-8\n"
print data

と書いて、UTF-8で保存すれば
送られてきたデータをそのまま返しても、また
print "文字列"
と書いても、文字化けしない。

この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Rでグラフを書く書き方をまと... | トップ | 言語プロトコル法、視線分析法 »
最新の画像もっと見る

トピックス」カテゴリの最新記事