Amazon

ラベル 文字コード の投稿を表示しています。 すべての投稿を表示
ラベル 文字コード の投稿を表示しています。 すべての投稿を表示

2011年9月16日金曜日

ケータイ、Androidの文字コードの袋小路


mixiモバイル、touch、PC版アプリを同時に作ろうとしていて文字コードの袋小路にハマる。
たぶんこれはmixiモバイルに限らないのでメモしておこう。

モバイル系は
au, docomo, softbankはShift-JISに対応。但し、
CSSを使う場合はiモード対応XHTMLにする必要がある。
XML宣言とi-mode用のDOCTYPE宣言が必要。

docomo, softbankはutf-8でも問題ないが
auはau browser6.2はutf-8に対応していない。7.2は対応している。
3G端末に限って言うと、UTF-8が使える条件は次のようになっている。
参照元はこちら
機種 XHTML HTML XHTML
(SSL)
HTML
(SSL)
docomo 3G
au ブラウザver7.2
au ブラウザver6.2 × × ×
SoftBank 3G
○:文字化けしない △:一部の条件下で文字化け ×:文字化けする

次にtouch版
iPhoneの場合、Shift-JISでもUTF-8でも問題ない。
Androidの場合、2.1においてはShift-JISだと問題がある。

参照元はこちら
文字エンコーディング Content-Typeヘッダ xml宣言の有無 結果
Shift_JIS text/html
application/xhtml+xml ×
UTF-8 text/html
application/xhtml+xml
EUC-JP text/html
application/xhtml+xml ×

つまりShift-JISだとAndroid  2.1で非対応となり、UTF-8だとau携帯が非対応(文字化け)となってしまう。
Shift-JISにして、Android 2.1の時だけContent-Typeヘッダーをtext/htmlに変換するのが一番手がかからないかなぁ。。。

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' 
あまりスマートな書き方じゃないけど、とりあえず暫定版ということで。

Amazon3