モバイルサイトを3キャリアでほぼ共通化して作りたい - http://d.hatena.ne.jp/tilfin/20080530/1212376626
上記のエントリで DoCoMo, au, SoftBank 用のモバイルサイトを XHTML で作成する場合のそれぞれの書き方を調べた。
その書き方に従って HTTP ヘッダと XHTML 宣言部分を出力する CGI サンプルを Python で書いてみた。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/usr/bin/env python
\# -*- coding: utf-8 -*-
import os
import codecs
class UserAgent:
def \_\_init\_\_(self, ua):
if ua.startswith("DoCoMo"):
self.kind = 1
elif ua.startswith("KDDI"):
self.kind = 2
elif ua.startswith("SoftBank") or ua.startswith("Vodafone") or ua.startswith("MOT"):
self.kind = 3
else:
self.kind = 0
def is_mobile(self):
return self.kind > 0
def is_docomo(self):
return self.kind == 1
def is_au(self):
return self.kind == 2
def is_softbank(self):
return self.kind == 3
def get\_content\_type(self):
if self.kind > 0:
return "Content-Type:application/xhtml+xml; charset=Shift_JIS"
else:
return "Content-Type:text/html; charset=UTF-8"
def get_declare(self):
if self.kind == 1:
return """<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//i-mode group (ja)//DTD XHTML
i-XHTML(Locale/Ver.=ja/1.0) 1.0//EN" "i-xhtml\_4ja\_10.dtd">"""
elif self.kind == 2:
return """<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//OPENWAVE//DTD XHTML 1.0//EN"
"http://www.openwave.com/DTD/xhtml-basic.dtd">"""
elif self.kind == 3:
return """<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//J-PHONE//DTD XHTML Basic 1.0 Plus//EN"
"xhtml-basic10-plus.dtd">"""
else:
return """<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">"""
agent = UserAgent(os.environ.get("HTTP\_USER\_AGENT", "N/A"))
print agent.get\_content\_type() + "\\r\\n\\r\\n" \+ agent.get_declare()
print '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">'
print "<body>"
file = "content.html"
if agent.is_mobile():
f = codecs.open(file, "r", "utf-8")
s = f.read()
print s.encode('cp932')
f.close()
else:
f = open(file, "r")
print f.read()
f.close()
print "</body></html>"

クラス UserAgent のコンストラクタには、クライアントのユーザーエージェント値を渡す。文字エンコーディングは、モバイルでは Shift_JIS 、通常は UTF-8 とした。
サンプルの最後のところで body 内のコンテンツを別ファイルから読み込んで書き出している。Shift_JIS へのエンコーディングを shift_jis と指定したところエラーになり、cp932 としたら成功した(この件については後で調べてみることにする)。
get_content_type() で Content-Type 部分が取れる。ケータイ以外のときが、Content-Type:text/html; となっているのは IE では MIME Type 判別がうまくいかないためか、ファイルのダウンロードしよう(保存するかどうかのダイアログが阿上がった)とするのでこうした。get_declare() ではそれぞれのキャリアに対応した XHTML 宣言部を返す。