携帯でメールに絵文字が正常に表示されない

473 views
Skip to first unread message

argun

unread,
Nov 27, 2010, 10:33:36 AM11/27/10
to Google-App-Engine-Japan

 こんばんは。
 僕はpython初心者です。 Google AppengineのメールAPIで携帯までメールを送信したい。

 メールの内容は日文+絵文字場合で、絵文字が表示されない。
 メールの内容は英語+絵文字場合で、絵文字が正常に表示される。

例えば、メールのbody
■sss
携帯でsss[emoji]が表示されている。

■sssあいう
携帯でsssあいう÷?が表示されて、絵文字表示できない。

下記はcode、ご覧ください。

try :
message    = mail.EmailMessage()
message.sender = settings.MAIL_FROM_ADDRESS
message.subject = msgDic.get('subject')
message.to    = msgDic.get('target')
message.body = paraDic.get('body')
message.send()
except:
pass
=================================
msgDicのvalueはunicode string,関してencode&decode,教えてください。
How to display the emoji in the mobile emial。please help me,Thankyou!
My Japanese is very poor ,よろしくお願いいたします。

PS:
  確認端末は:AU SH006

Takashi Matsuo

unread,
Nov 29, 2010, 2:42:44 PM11/29/10
to google-app-...@googlegroups.com
Google 松尾です。

携帯の絵文字には詳しくないですが、おそらく難しそうです。

現在の App Engine メール送信機能では、日本語が入っているメールは ISO-2022-JP
でエンコードされてしまいます。

どなたか出来ている方はいらっしゃいますか?

自由にメールのエンコード方法を指定できるようになれば出来そうですが、それは今のところ無理です。

-- matsuo

> --
> このメールは Google グループのグループ「Google-App-Engine-Japan」の登録者に送られています。
> このグループに投稿するには、google-app-...@googlegroups.com にメールを送信してください。
> このグループから退会するには、google-app-engine...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/google-app-engine-japan?hl=ja からこのグループにアクセスしてください。
>
>

--
Takashi Matsuo
Developer Relations
Developer Advocate for Google App Engine/iGoogle
Google Japan, Inc.

Takao Nakaguchi

unread,
Nov 29, 2010, 8:26:28 PM11/29/10
to google-app-...@googlegroups.com
中口です。

この件ちょくちょく調べているのですが、まともに使える方法はまだ
見つけられていません。

App Engineから送られるメールの文字コードは、松尾さんが言及されているように、
日本語が入っていれば基本ISO-2022-JPです。中国語が入っていればGB2312(だったはず)、
キャラクタによっては、UTF-8で送られることもあります。

携帯でちゃんと絵文字を表示させるには、文字コードを指定して、その文字コードで
書かれた文章を出力できる必要があるので、例えば送信メールのエンコーディングを
指定してかつメール本文をbyte[]で渡せるような機能か、あるいは、

・Google提案のUnicode絵文字で書けば、携帯キャリア毎に適切なエンコーディング、
キャラクタコードに変換して送信

という機能が必要になります。
個人的には後者の機能が実装されるととても嬉しいんですが。

2010年11月30日4:42 Takashi Matsuo <tma...@google.com>:

argun

unread,
Nov 30, 2010, 7:37:10 AM11/30/10
to Google-App-Engine-Japan
メールは ISO-2022-JPでエンコードしました、問題が解決しました。
有難うございました。

argun

unread,
Nov 30, 2010, 7:37:35 AM11/30/10
to Google-App-Engine-Japan
メールは ISO-2022-JPでエンコードしました、問題が解決しました。
有難うございました。

On 11月30日, 午前9:26, Takao Nakaguchi <takao.nakagu...@gmail.com> wrote:
> 中口です。
>
> この件ちょくちょく調べているのですが、まともに使える方法はまだ
> 見つけられていません。
>
> App Engineから送られるメールの文字コードは、松尾さんが言及されているように、
> 日本語が入っていれば基本ISO-2022-JPです。中国語が入っていればGB2312(だったはず)、
> キャラクタによっては、UTF-8で送られることもあります。
>
> 携帯でちゃんと絵文字を表示させるには、文字コードを指定して、その文字コードで
> 書かれた文章を出力できる必要があるので、例えば送信メールのエンコーディングを
> 指定してかつメール本文をbyte[]で渡せるような機能か、あるいは、
>
> ・Google提案のUnicode絵文字で書けば、携帯キャリア毎に適切なエンコーディング、
> キャラクタコードに変換して送信
>
> という機能が必要になります。
> 個人的には後者の機能が実装されるととても嬉しいんですが。
>
> 2010年11月30日4:42 Takashi Matsuo <tmat...@google.com>:
>
> > Google 松尾です。
>
> > 携帯の絵文字には詳しくないですが、おそらく難しそうです。
>
> > 現在の App Engine メール送信機能では、日本語が入っているメールは ISO-2022-JP
> > でエンコードされてしまいます。
>
> > どなたか出来ている方はいらっしゃいますか?
>
> > 自由にメールのエンコード方法を指定できるようになれば出来そうですが、それは今のところ無理です。
>
> > -- matsuo
>

argun

unread,
Dec 2, 2010, 8:04:44 PM12/2/10
to Google-App-Engine-Japan
すみません、新しい問題があります。
ISO-2022-JPでエンコードの場合、半角カナ&全角記号を入力し、エラーが出しました。
例えば、アイウエオ、「~」、「-」、「①」、「Ⅰ」(ローマ数字)、「ⅰ」(ローマ数字)、「㌧」など

>>>print repr('あいうえおかきくけこさしすせそ'.decode('utf-8').encode('iso2022-jp')) ------>OK
>>>print repr('アイウエオ'.decode('utf-8').encode('iso-2022-jp')) -------->NG


標準な解決方法がありますか?教えていただけませんか?よろしくお願いいたします。



On 11月30日, 午前3:42, Takashi Matsuo <tmat...@google.com> wrote:

Ian Lewis

unread,
Dec 2, 2010, 8:55:18 PM12/2/10
to google-app-...@googlegroups.com
こんにちは、BPのイアンです。

もし、 iso-2022-jp でメールを送信したいのであれば、iso-2022-jp に変換できない文字を削るしかないと思います。① ->
1、ー -> -、など

会社では携帯メール対応の文字コード処理でよくやっています。

body = u"~-①"

replace_map = (
(u'\uff5e', u'\u301c'), # ~
(u'\u2160', '|'), # |
(u'\uff0d', u'-'), # ー
(u'\u2460', u'1'),
(u'\u2461', u'2'),
(u'\u2462', u'3'),
(u'\u2463', u'4'),
(u'\u2464', u'5'),
(u'\u2465', u'6'),
(u'\u2466', u'7'),
(u'\u2467', u'8'),
(u'\u2468', u'9'),
(u'\u2469', u'10'),
(u'\u246a', u'11'),
(u'\u246b', u'12'),
(u'\u246c', u'13'),
(u'\u246d', u'14'),
(u'\u246e', u'15'),
(u'\u246f', u'16'),
(u'\u2470', u'17'),
(u'\u2471', u'18'),
(u'\u2472', u'19'),
(u'\u2473', u'20'),
(u'\u2474', u'(1)'),
(u'\u2475', u'(2)'),
(u'\u2476', u'(3)'),
(u'\u2477', u'(4)'),
(u'\u2478', u'(5)'),
(u'\u2479', u'(6)'),
(u'\u247a', u'(7)'),
(u'\u247b', u'(8)'),
(u'\u247c', u'(9)'),
(u'\u247d', u'(10)'),
(u'\u247e', u'(11)'),
(u'\u247f', u'(12)'),
(u'\u2480', u'(13)'),
(u'\u2481', u'(14)'),
(u'\u2482', u'(15)'),
(u'\u2483', u'(16)'),
(u'\u2484', u'(17)'),
(u'\u2485', u'(18)'),
(u'\u2486', u'(19)'),
(u'\u2487', u'(20)'),
(u'\xa0', u' '), # 空白
)

for f, t in replace_map:
body = body.replace(f, t)

2010/12/3 argun <argu...@gmail.com>:

--
Ian

http://www.ianlewis.org/

argun

unread,
Dec 3, 2010, 12:40:33 AM12/3/10
to Google-App-Engine-Japan
lan lewis さん

有難うございます。
例えば、全角㍉、㊤、㍽、㈱の場合で、どのように処理しますか?
対応文字がありません。

私のAPP
GAE全部ディフォルトcharset:utf-8

workflowは下記です
①blobstoreに格納した内容を取得(unicode形式)
②step①のunicode.encode('ISO2022_jp')
③step②内容の中に絵文字を処理する
④mail.body=step③内容
⑤mail.send()

step②に、全角㍉、㊤、㍽、㈱があるの場合、エラーが出してしまう
例:
print repr('㍽'.decode('utf-8'))→u'\u337d'
print repr('㍉'.decode('utf-8'))→u'\u3349'
print repr('㈱'.decode('utf-8'))→u'\u3231'

print u'\u337d'.encode('iso2022_jp')
UnicodeEncodeError: 'iso2022_jp' codec can't encode character
u'\u337d' in position 0: illegal multibyte sequence

認識不足の場合は、ご指導してください。
Thank you。
> 2010/12/3 argun <argun...@gmail.com>:

midoridge

unread,
Dec 3, 2010, 4:16:12 AM12/3/10
to google-app-...@googlegroups.com
argunさん

midoridgeです。はじめまして。

基本的には、lan lewis さんのいうように、エラーになる文字を事前に定義しておいて、置き換えればいいんじゃないですかね。

> 例えば、全角㍉、㊤、㍽、㈱の場合で、どのように処理しますか?
> 対応文字がありません。

対応文字がないというのではなくて、エラーになるのであれば、lan lewis さんの提示したマップに、追加すればよいかと思うのですけど?
マップに追加しない理由はあるのですか??


他の方法だと、encode('iso-2022-jp')のときに、try~exceptで、エラーを捕まええて、エラーになる文字だけを、〓とかに順番に置き換えてから、再度encodeするとかでしょうか。

ただ、この方法だと、1文字ごとにencodeできるかをチェックする必要があるので、非効率です。

なので、lan lewis さんの提示したマップに追加して置き換えて、それでもエラーになる場合は、送信せず、エラー画面を表示するとかのほうがいいのではないでしょうか。

----
def toJis(text):
def conv(word):
try:
word.encode('iso-2022-jp')
return word
except:
return u"〓"

text_u = text.decode('utf-8')
text_j = ''

try:
text_j = text_u.encode('iso-2022-jp');
except:
buffer = ''
for i in range(0,len(text_u)):
buffer += conv(text_u[i])
text_j = buffer.encode('iso-2022-jp');

return text_j


2010年12月3日14:40 argun <argu...@gmail.com>:

argun

unread,
Dec 6, 2010, 8:10:13 AM12/6/10
to Google-App-Engine-Japan

midoridgeさん

こんばんは。
全角処理の方法を参照しました。
有難うございます。
各国文字のencodeとdecodeことは難しそうです。
That's God's conspiracy.
> 2010年12月3日14:40 argun <argun...@gmail.com>:

Hiroaki Kawai

unread,
Dec 6, 2010, 8:16:56 PM12/6/10
to google-app-...@googlegroups.com
川井です。

絵文字の部分はすっとばして文字エンコード変換に部分的に反応します。
「アイウエオ」は半角で、u'\uff71\uff72\uff73\uff74\uff75' だと思いますが、
replace_map を持たなくてもある程度は対応可能です。

1.非対応の文字は消してしまう方法
u'\uff71\uff72\uff73\uff74\uff75'.encode("iso-2022-jp","ignore")

2.?で置き換える
u'\uff71\uff72\uff73\uff74\uff75'.encode("iso-2022-jp","replace")

3.正規化してしまう
unicodedata.normalize("NFKC",u'\uff71\uff72\uff73\uff74\uff75').encode("iso-2022-jp", "replace")

発展版として、"ignore", "replace" に相当する部分を自分で新設して
自分で定義した replace_map で置換するようにすると、さらに
エレガントです。この場合は codecs.register_error を使います。


2010年12月6日22:10 argun <argu...@gmail.com>:

gorn

unread,
May 25, 2011, 3:24:11 AM5/25/11
to google-app-...@googlegroups.com
絵文字メールについてはいろいろとトライしているのですが、今のところ解決策がなく苦慮しています。
mail_service_pbのMailMessageを直接使って、MakeSyncCallしてみたりなど、
Subjectに関してはこのルートだとエンコードを弄れるようですが。
まともに使える方法はないのでしょうか?

Takao Nakaguchi

unread,
May 25, 2011, 5:22:04 AM5/25/11
to google-app-...@googlegroups.com
中口です。

Javaだと、送りたい生のバイト配列を無理やり文字列に入れて
送れば、絵文字入りのメールが送れます。

MailService.Message m = new MailService.Message();
//送信先など設定。
m.setTextBody(new String(/* 機種依存の文字コード配列 */, "ISO8859-1"));
//送信

こんな感じです。
Pythonでも同様にできたはず。

但し、仕様としてはどこにも書かれていないので、ある日突然
送れなくなる可能性もあります。


ご参考になれば。

2011年5月25日16:24 gorn <gor...@gmail.com>:

> --
> このメールは Google グループのグループ「Google-App-Engine-Japan」の登録者に送られています。
> このグループに投稿するには、google-app-...@googlegroups.com にメールを送信してください。
> このグループから退会するには、google-app-engine...@googlegroups.com
> にメールを送信してください。
> 詳細については、http://groups.google.com/group/google-app-engine-japan?hl=ja
> からこのグループにアクセスしてください。
>

--
Takao Nakaguchi
takao.n...@gmail.com

Reply all
Reply to author
Forward
0 new messages