PCからauの携帯に絵文字を使ったメールを送りたいと考えていて、とりあえず太陽の絵文字を件名に入れたいのですが上手くいきません。
auの携帯から件名に太陽の絵文字だけを入れてPCで受信すると、件名は次のようになっています。
Subject: =?iso-2022-jp?B?GyRCdUEbKEI=?=
次に、auの絵文字一覧表から、太陽の絵文字の文字コードを次のコードで処理していますが、上記のGyRCdUEbKEI=と同じ結果になりません。
太陽の絵文字がShift-JISコード F660
Dim B() As Byte = {&HF6, &H60}
Dim C As Char = Chr(B(0) * &H100 + B(1))
MessageBox.Show(GetBase64String(C))
JISコードの 7541 も同様の方法で試しましたが駄目でした。
開発はVB2005で行っています。
よろしくお願いします。
太陽の絵文字がbase64で、 GyRCdUEbKEI= に変換されていると理解しています
質問のタイトル間違えました。
auの絵文字付きメールをPCから携帯に送信するには?
が正解です。
すみませんでした。
GyRCdUEbKEIを復号し,16進数で表すと,
&H1B &H24 &H42 &H75 &H41 &H1B &H28 &H42
の8バイトとなります。
最初と最後の3バイトはエスケープシーケンスです。
ですから,
&H1B &H24 &H42 -> ESC$B (JIS-1983)
&H75 &H41 -> 絵文字の文字コード
&H1B &H28 &H42 -> ESC(B (ASCII)
と解釈できます。
えどたつさんのコードはおそらくエスケープシーケンスが含まれていないのだと考えます。
Base64の文字列を一致させたければ文字コードの前と後ろにエスケープシーケンスを追加してみてください。
ベホマスライム剣士さんありがとうございました。
Dim Q() As Byte = {&H1B, &H24, &H42, &H75, &H41, &H1B, &H28, &H42}
としてバイト配列に入れてから、
Convert.ToBase64String(Q)
とすると確かにGyRCdUEbKEI=と同じに変換できました。
ありがとうございました。
ところで、この絵文字の文字コードの前と後ろにESC$B (JIS-1983)やESC(B (ASCII)がつくのは決まりごとなのでしょうか?
7541は、太陽の絵文字のJISコードなので、
Dim Q() As Byte = {&H75, &H41}
というバイト配列から一気にVB2005でGyRCdUEbKEI=にする変換方法があれば非常に助かります。
よろしくお願いします。
> PCからauの携帯に絵文字を使ったメールを送りたいと考えていて、
> とりあえず太陽の絵文字を件名に入れたいのですが上手くいきません。
絵文字を扱うのであれば、機種の違いにもご注意を。
http://www.au.kddi.com/ezfactory/tec/spec/3.html
> 前と後ろにESC$B (JIS-1983)やESC(B (ASCII)がつくのは決まりごとなのでしょうか?
ISO-2022-JP の場合、エスケープシーケンスを使って文字集合を
切り替えることで、同じバイナリを別の文字として処理しています。
具体的には、
1B,28,42「{Esc} ( B」が来ると ASCII
1B,28,4A「{Esc} ( J」が来ると JIS X 0201-1976
1B,24,40「{Esc} $ @」が来ると JIS X 0208-1978
1B,24,42「{Esc} $ B」が来ると JIS X 0208-1983
です。(詳細については、RFC1468 を参照して下さい)
エスケープシーケンスを取り除いてしまうと、たとえば
24,22=「あ」=「$"」
22,24=「△」=「"$」
のように、別の文字列が同じバイナリになってしまう可能性が出てきます。
> 7541は、太陽の絵文字のJISコードなので、
とは限りません。ASCII の「uA」2文字の場合も、75,41 となるからです。
それが絵文字と確定している場合に限り、{Esc}$B のエスケープシーケンスを付与してください。
Dim Q() As Byte = {&H75, &H41}
Dim bin As New List(Of Byte)()
bin.AddRange(New Byte() {&H1B, &H24, &H42}) '{Esc}$B:JIS X 0208-1983
bin.AddRange(Q)
bin.AddRange(New Byte() {&H1B, &H28, &H42}) '{Esc}(B:ASCII
Dim result As String = System.Convert.ToBase64String(bin.ToArray())
ちなみに通常の環境では、System.Text.Encoding.GetEncoding で得られるエンコードに、
絵文字に対応したものは用意されていなかったと思います。
>ところで、この絵文字の文字コードの前と後ろにESC$B (JIS-1983)やESC(B (ASCII)がつくのは決まりごとなのでしょうか?
詳しくは魔界の仮面弁士さんがおっしゃる通りです。
非常に簡単に言うならば,漢字などの2バイト文字列の前にESC$B,後ろにESC(Bをつけることで1バイト文字との区別をします。
「決まりごと」となのか,と言えば,決まりごとです。当然ですが,エスケープシーケンスがないと,1バイト文字列と2バイト文字列が区別できませんから。
魔界の仮面弁士さん、ベホマスライム剣士さん
いろいろとありがとうございました。
理論的にも理解できましたので、これで解決できると思います。
ひとまず、解決ということにさせていただきます。
また何かありましたらご質問させていただきますので、よろしくお願いします。
大変ありございました。