MyMiniCity踏んでください!!

ただいま絶賛MyMiniCity参加中です.是非リンクを踏んでください!!(笑
February 10th, 2006

mbstringとiconvでMIMEエンコードメモ

(Read: 17484)
Add to Hatena Bookmark

参照:
次はmbstringとiconvでMIMEエンコード関連のメモです

mbstring

mb_encode_mimeheader()は第1引数の文字列をMIMEエンコードします.細かい説明などはマニュアル見てねと.
で,調べてみると下記のような違いがありました.
とりあえずBASE64でエンコードする場合,

・「[ASCII][マルチバイト]」は「[エンコード文字列]」になる
・「[ASCII] [マルチバイト]」は「[ASCII] [エンコード文字列]」になる

という結果になります.多分試していないけどエンコード後の文字列として先頭の1単語はASCIIのみの構成だとMIMEエンコード対象外になります.
ちなみにQuoted-Printableだと1文字ずつエンコードするかどうか評価されます.


$ /usr/local/php-4.3.11/bin/php -r 'mb_language( "ja");mb_internal_encoding( "UTF-8");echo mb_en
code_mimeheader( "aaa 1234567890123 aaa 45678901234567890","UTF-8");'
aaa =?UTF-8?B?77yR77yS77yT77yU77yV77yW77yX77yY77yZ77yQ77yR77yS77yTIGFh?=
=?UTF-8?B?YSDvvJTvvJXvvJbvvJfvvJjvvJnvvJDvvJHvvJLvvJPvvJTvvJXvvJbvvJc=?=
=?UTF-8?B?77yY77yZ77yQ?=No log handling enabled - turning on stderr logging

$ /usr/local/php-4.4.2/bin/php -r 'mb_language( "ja");mb_internal_encoding( "UTF-8");echo mb_enc
ode_mimeheader( "aaa 1234567890123 aaa 45678901234567890","UTF-8");'
aaa =?UTF-8?B?77yR77yS77yT77yU77yV77yW77yX77yY77yZ77yQ77yR77yS77yTIGFh?=
=?UTF-8?B?YSDvvJTvvJXvvJbvvJfvvJjvvJnvvJDvvJHvvJLvvJPvvJTvvJXvvJbvvJc=?=

$ /usr/local/php-5.1.2/bin/php -r 'mb_language( "ja");mb_internal_encoding( "UTF-8");echo mb_enc
ode_mimeheader( "aaa 1234567890123 aaa 45678901234567890","UTF-8");'
aaa =?UTF-8?B?77yR77yS77yT77yU77yV77yW77yX77yY77yZ77yQ77yR77yS77yTIGFh?=
=?UTF-8?B?YSDvvJTvvJXvvJbvvJfvvJjvvJnvvJDvvJHvvJLvvJPvvJTvvJXvvJbvvJc=?=
つまりmail()の第1引数にmb_encode_mimeheader()の値を渡したい場合,


$subject = "元の件名だよー〜〜〜ん";
$encode = substr( mb_encode_mimeheader( "Subject: $subject"), 9);
とやってあげればいいです.PHP 4.4.0,5.0.5からmb_encode_mimeheader()の第4引数で文字数カウントのオフセットがつけられるようになったのですが,想定用途的に必要なくなってしまいました(苦笑

第4引数で指定してもいいんだけど第2・3引数を記述しなくてはいけないので,どちらがいい記述かどうかは難しいところになると思います
マニュアルがある分(実はないけど)第4引数の方がいい? かもしれないけど下位互換性が低いです.

iconv

iconvでもMIMEエンコード.もっと基礎から入るのですが,iconvの文字エンコードの指定は内部・入出力の3つを指定しておかなければなりません.3つ一度に指定もできるようになるとうれしいなぁ.
って言うかiconv_set_encoding()は"all"とかあるのかよ.このバランスの悪さがPHPクオリティだ.


iconv_set_encoding("internal_encoding","UTF-8");
iconv_set_encoding("input_encoding","UTF-8");
iconv_set_encoding("output_encoding","UTF-8");
後はMIMEエンコード.これはiconv_mime_encode()でやります.mb_encode_mimeheader()に名前が似てますが,順番が違うことに注意.
こちらはこんな感じで使います.


$ /usr/local/php-5.1.2/bin/php -r 'iconv_set_encoding("internal_encoding","UTF-8");iconv_set_encoding("input_encoding","UTF-8");iconv_set_encoding("output_encoding","UTF-8");var_dump(iconv_get_encoding());echo iconv_mime_encode( "Subject", "aaa 1234567890123 aaa 45678901234567890");'
array(3) {
["input_encoding"]=>
string(5) "UTF-8"
["output_encoding"]=>
string(5) "UTF-8"
["internal_encoding"]=>
string(5) "UTF-8"
}
Subject: =?UTF-8?B?YWFhIO+8ke+8ku+8k++8lO+8le+8lu+8l++8mO+8me+8kA==?=
=?UTF-8?B?77yR77yS77yTIGFhYSDvvJTvvJXvvJbvvJfvvJjvvJnvvJDvvJHvvJI=?=
=?UTF-8?B?77yT77yU77yV77yW77yX77yY77yZ77yQ?=
これもmail()に渡すときは適当にsubstrなどすればいいでしょう.
ちなみにiconvはMIMEエンコードのデコードはiconv_mime_decode_headers()という関数でまとめてできるので便利ですよ.


▼ この記事へのコメント ▼
エンコード後の文字列を見ると1文字3バイトということがとても分かりやすく出ていますね.

トピックの参照元

▼最近のトピック

▼ 人気のトピック


< 過去の記事 [ 2All Categories ] 新しい記事 >
Powered by gsblog (customize)

[ POST ] [ AddLink ] [ CtlPanel ]

Subscribe blog

Bookmark blog

About me

about me

応援しています

我が息子が産まれたアクア・バースハウス(東京都世田谷区にある助産院)を応援しています.

翻訳のお仕事

腕に自信がある方,修行をしたい方はこちらをどうぞ.

2006 calendar

2月
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
| Day | Month | Year |

Powered by RRDTOOL.

Archives

Categories

Links


Mail to admin

人気ブログランキングへ RSS feed meter for http://blog.poyo.jp/ Search Engine Optimization
blogpeople.netに登録!! スカウター : よくきたblog

My Google news

My Google News

Related site

ころんころん♪ べびぽよ フォト蔵Wiki
string(40) "/categ-1/year-2006/month-2/id-1139566453"