お?いけるくさい?

iPhoneアプリエンジニアのたまごです。いっちょまえエンジニア目指してちいさな発見や学んだことを覚え書きしていきます!Objective-C/iOS/開発

メーラー エンコード 文字化け

Webviewからmailto:っていうスキームをひろって

メーラーを起動して本文を入れておきたい!

というときに、

日本語の場合は必ずencodeをかけないといけなくて、

たとえば

 

<case 1>

------------------------------------------------

●宛先:xxx@mail.com

●題名:おはよう

●本文:[NSString stringWithFormat:@"朝ですね。%@", _msg];

( _msg = @"あいらぶゆー!" ; )

------------------------------------------------

この場合、以下のようにします。

 

    NSString* title = @"おはよう";

    NSString* body = [NSString stringWithFormat:@"朝ですね。%@",_msg];

    NSString* mailtoURL = [NSStringstringWithFormat:@"xxx@mail.com?subject=%@&body=%@",

                           [title stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],

                           [body stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    [[UIApplicationsharedApplication] openURL:[NSURLURLWithString:mailtoURL]];

 

stirngByAddingPercent...メソッドでUTF8にエンコードかけているので

これでスンとメーラーが立ち上がってくれるはず!

 

ではでは、

<case 2>

------------------------------------------------

●宛先:xxx@mail.com

●題名:おはよう

●本文:[NSString stringWithFormat:@"朝ですね。%@", _msg];

( _msg = @" &あいらぶゆー!" ; )

------------------------------------------------

私の場合ここで詰まった!

同じように書いたはずなのに、途中で本文が切れている!

な ぜ 。 

 

問題はこの変数_msgに入れる文字でした。

(普通に打てばこの不思議現象は起こらないのかもしれないのですが、)

html内から拾った場合、「&」という文字以下が拾えなくなってしまいます。

一般的には

*「html escape」とか、*「url encode」とかっていうキーワードでぐぐると

情報はいくつかあるようです。

 

わたしも上記のメソッドはいくつか調べて実行してみたのですが、

うまく反映されず、結局ブチっと切れたメールしか立ち上がらず..

最終的にこの方法で解決しました!↓

 

①まずは文字コードに変換するメソッドを用意

-(NSString *)htmlEntityEncode:(NSString *)string

{    

    string = [string stringByReplacingOccurrencesOfString:@"&"withString:@"%26"];

    string = [string stringByReplacingOccurrencesOfString:@"?"withString:@"%3f"];

    

    return string;

}

NSStringのメソッドで、文字を置換するメソッドがあります。

これを使って、@"&"という文字がきたら

この文字コードに変換してね、と書いてやります。

他にもあらゆる記号で文字コードさえかければ変換かけれます。

 

②本文をまずUTF8に変換する

 NSString* title = @"おはよう";

    NSString* body = [[NSString stringWithFormat:@"朝ですね。%@",_msg] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

先ほどのmailtoの作成で使ったメソッドと同じものをbodyに対してかけます。

 

③それをさらに文字コード変換する

    NSString* title = @"おはよう";

    NSString* body = [[NSString stringWithFormat:@"朝ですね。%@",_msg] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSString* enc = [self htmlEntityEncode:body];

追加したメソッドを実行するときはselfで。

 

④できあがったNSStringをそのままメールにつっこむ

    NSString* title = @"おはよう";

    NSString* body = [[NSString stringWithFormat:@"朝ですね。%@",_msg] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSString* enc = [self htmlEntityEncode:body];

    NSString* mailtoURL = [NSStringstringWithFormat:@"xxx@mail.com?subject=%@&body=%@",

                           [title stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],

                            enc];

    [[UIApplicationsharedApplication] openURL:[NSURLURLWithString:mailtoURL]];

これ、やってみるとわかるかと思いますが、

AddingPercent...を使わずに普通に代入してメーラーを起動しようとすると

ぴくりともしないので、

絶対にこの書き方じゃないとダメなのかと思いきや、

実はエンコードさえちゃんとかかっていれば認識して立ち上がってくれます。

ちなみにhtmlEntityEncode→UTF8Encodeの順だとうまくいきません(注)※

 

メソッドとステップを1つ追加で無事解決!

誰かの参考になりますようにヽ(´ω)ノ♪