Amazon

2011年9月6日火曜日

Pythonによるモバイル開発の文字コード2

前回に引き続き、Pythonの文字コードで引っかかったお話。
今回はPythonというよりも、Opensocial APIのgadgets.io.endoceValues()メソッドのお話。

Opensocialのアプリを作成している際
HTML側のメタタグで
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=Shift_JIS" />
と指定した上で
<input type="button" onclick="postSubmit()"/>
と書く。

この時、JavaScriptの
function postSubmit(){
...
var value1="";
var value2="";
params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.POST;
params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
var post_data{
'key1':value1,
'key2':value2,
} 
params[gadgets.io.RequestParameters.POST_DATA] = gadgets.io.encodeValues(post_data);
と書いてPOSTリクエストをすると、
gadgets.io.endoceValues()が有効になり、
POSTされる文字コードは,入力オブジェクトを URL エンコードしたデータ文字列に変換される。
POST のデフォルト エンコードは application/x-www-form-urlencoded でありShift-JISではない。
 
よって、Python側で受けるとき
self.request.charset="Shift-JIS"
をセットしてしまうと返って文字化けを引き起こしてしまう。
ということで、JavaScriptからPOSTされた場合には、self.request.charset="Shift-JIS"
は呼ばないようにif文を書いてあげる。
userAgent=detectAgent(self.request.user_agent)
if userAgent != 'pc':
 
ここでdetectAgentメソッドは独自メソッドで、self.request.user_agent(HTTP_USER_AGENT)に入っている文字列からpcかsmartphoneかmobileかを判定する。
def detectAgent(userAgent):
    if userAgent.startswith('DoCoMo'):
        return 'mobile'  
    elif userAgent.startswith('KDDI-'):
        return 'mobile'
    elif userAgent.startswith('SoftBank'):
        return 'mobile'
    elif userAgent.startswith('Vodafone'):
        return 'mobile'
    elif userAgent.startswith('Mozilla/5.0 (iPhone'):
        return 'smartphone'
    elif userAgent.startswith('Mozilla/5.0 (Linux'):
        return 'smartphone'
    else:
        return 'pc' 
あまりスマートな書き方じゃないけど、とりあえず暫定版ということで。

0 件のコメント:

コメントを投稿

Amazon3