2010年3月4日木曜日
移転

はてなダイアリーに移転することにしました。
http://d.hatena.ne.jp/u87/

コードとか見やすくなると思います。
ここの記事はまとめなおしたりして、むこうにも書く予定。

おせわになりました。



0 コメント | コメントを書く | コメントの表示
2010年3月2日火曜日
地図の中央に常に十字マークを表示する - Google Maps API v3

元ネタはここ↓
4-2:地図の中心に常に『十字マーク』を表示する - Google Maps 活用講座
でもここはversion 2なので、version 3向けに改造する必要がある。

と言ってもそう難しいものではなく、地図が移動したら十字マークを描画すると読み替えれば簡単です。
4-2:地図の中心に常に『十字マーク』を表示する - Google Maps 活用講座


こう書いてあるとおり、画像をマーカーに使って、移動するたびにその画像を地図中央に移動させている。
ただversion 3だとmapイベントにmoveがない。

Google Maps API version 3 リファレンス (Google Maps API Version3 日本語ドキュメント(非公式))
リファレンスを確認すると、dragがそれのようだ。

画像はそのままパクらせて頂きました。
まずはマーカーに使う画像の情報を定義します。
var image = new google.maps.MarkerImage(
'images/center.gif'
, new google.maps.Size(39, 39)
, new google.maps.Point(0,0)
, new google.maps.Point(19,19)
);

細かなプロパティはリファレンスを参照していただくとして、簡単に説明。
まずはURLを指定。相対で大丈夫らしい。
続くsizeはその画像のサイズ。
次はその画像の表示開始座標であるorigin。version 3では大きなサイズの画像も使用できるようになっている。なので、複数のアイコンをつなげた大きな画像を用意して、その画像のどこから開始するのかを記載する。これと上の画像サイズの指定で見せたい箇所を指定することができる。
anchorが判りにくくて困った。
表示する際に開始地点(指定された緯度経度)をどこにするか、ということだと解釈した。
デフォルトでは、アンカーはイメージの下辺 - 中央(幅 / 2, 高さ の座標値)。つまりマーカーは指定された LatLng の位置に配置されたときは、アンカーの定義されたピクセル値は指定されたLatLngの位置です。
Google Maps API version 3 リファレンス (Google Maps API Version3 日本語ドキュメント(非公式))

デフォルトのマーカーは画像の下辺の中央がその地点であることを考えると、そうなのかな?って。
なので、画像の中央をその地点にしたいのであれば、XもYもサイズの半分を指定すればいいということだと思ったけど(伝わる?)。

これでプロパティの設定が完了。
次にマーカー…というか、画像マーカーを設定する。
var centerIcon = new google.maps.Marker({
icon: image
});

とりあえずfunctionの外側に書いた。

でもってonload=""で読み込んでる初期化関数で、地図上にマークしてやる。
centerIcon.setMap(map);
centerIcon.setPosition(myLatLng);

setMap()とsetPosistion()はnewの中でやってもいいかな?
var centerIcon = new google.maps.Marker({
icon: image
, map: map
, position: myLatLng;
});


これでとりあえず中央に表示されるようになる。
まだイベントを追加してないので、最初に設定した場所から移動してくれない。


dragイベントを追加してやる。
google.maps.event.addListener(map, 'drag', function() {
drawMarker(map.getCenter());
});

ちなみにイベント処理後にも同じようにdrawMarker()を追加しないと、ドラッグが発生するまでマーカーを表示してくれない。

で、drawMarker()はこれだけ。
function drawMarker(centerLocation){
centerIcon.setPosition(centerLocation);
}

地図の中央を引数にして、その場所に移動させてやる。



…がしかし!

なんだろう、この重さは。


ドラッグしても一瞬、地図についていっちゃうのね。
メモリがグルグルしてるので、恐らく処理的に思いのかもしれない。
ソースを最適化してやる必要があるのかな?
JavaScriptはよー判らん。



0 コメント | コメントを書く | コメントの表示
ひとりごと

元々別にブログを持っていたが、他の記事との兼ね合いでプログラミングやサーバ関連をここに持ってきた。
それはそれでいいんだけど、日本のブログサービスと比較すると、やっぱり不親切に感じることが多いbloggerである。それが放置してきた一因でもあるんだけど。

移転しようかなぁ?

ブックマークだけ使ってるはてなあたりに。



0 コメント | コメントを書く | コメントの表示
2010年3月1日月曜日
緯度経度から住所を取得してみる - Google Maps API v3

緯度経度から住所を取得する

サンプルはここにある。
http://code.google.com/intl/ja/apis/maps/documentation/v3/services.html#ReverseGeocoding

まずはGoogle Maps APIにおける、Geocoderのリクエスト方法から。
下記URLを見ると、プロパティの一覧がある。
GeocoderRequest
Google Maps API V3 Reference - Google Maps JavaScript API V3 - Google Code

住所や郵便番号から検索する場合は、addressプロパティに住所か郵便番号を入れてやる。
緯度経度から検索する場合は、latLngに緯度経度を入れてやる。

レスポンスは以下。

GeocoderResponse
Google Maps API V3 Reference - Google Maps JavaScript API V3 - Google Code


formatted_addressというのが、例えば「日本,愛知県名古屋市○○区○○N丁目NNN」のような形式の文字列。

テストは、クリックした箇所を地図の中心にしてマーカーを置くサンプルを下にしました。
http://code.google.com/intl/ja/apis/maps/documentation/v3/examples/event-arguments.html
クリックした箇所の緯度経度はイベントオブジェクトから簡単に取得できるので、そいつをGeocoderに入れてやるようにソースを修正すればいい。

ソースのイメージはこんなふう。

var geocoder = new google.maps.Geocoder();
geocoder.geocode({latLng: location}, function(results, status){
if(status == google.maps.GeocoderStatus.OK){
// 正常に処理ができた場合
} else {
// エラーの場合
}
});


レスポンスである配列resultsの構成はこうなっている。
{types[]: String,
formatted_address: String,
address_components[]: {
short_name: String,
long_name: String,
types[]: String
},
geometry: {
location: LatLng,
location_type: GeocoderLocationType,
viewport: LatLngBounds,
bounds: LatLngBounds?
}
}


まずはresults[].formatted_addressを表示してみる。

名古屋パルコの西館はこういうふうに取得できた
[0]日本, 愛知県名古屋市中区栄3丁目29?1
[1]〒460-8681
[2]〒460-8406
[3]〒460-8430
[4]〒460-8432
[5]〒460-8791
[6]日本, 愛知県名古屋市中区栄3丁目29
[7]日本, 愛知県名古屋市中区栄3丁目
[8]日本, 愛知県名古屋市中区栄
[9]日本, 愛知県名古屋市中区

※ただしクリックする箇所によって番地や郵便番号(の並び)は微妙に異なる。

名古屋パルコといえば、対になるのはナディアパークだよな?ってことでナディアパークはこちら。

[0]日本, 伊勢町通り
[1]〒460-8434
[2]〒460-8435
[3]〒460-8678
[4]〒460-8685
[5]〒460-8433
[6]〒460-8444
[7]〒460-8432
[8]〒460-8674
[9]〒460-8688


住所じゃなくて、通りの名前と郵便番号が取得できた。

名古屋ってことで、市役所はどうかと思って、調べてみると…

[0]〒460-8508
[1]〒460-8501
[2]〒460-8534
[3]〒460-8520
[4]〒460-8522
[5]〒460-8521
[6]〒460-8528
[7]〒460-8513
[8]〒460-8507
[9]〒460-8514

※これもクリックする箇所によって郵便番号の並びが変わったり、「日本,大津通」が出てくる。

こちらも郵便番号。
どういう違いがあるのだろう?

今度はresults[].address_components[]を確認する。
これにはshort_namelong_nametypes[]の三つがあるので、それぞれ表示させる。
面倒なのでresults[0]だけを対象にする。

名古屋パルコ(西館)
---------------
[0]short name : 1
[0]long name : 1
[0]types[0] : sublocality
[0]types[1] : political
---------------
[1]short name : 29
[1]long name : 29
[1]types[0] : sublocality
[1]types[1] : political
---------------
[2]short name : 3丁目
[2]long name : 3丁目
[2]types[0] : sublocality
[2]types[1] : political
---------------
[3]short name : 栄
[3]long name : 栄
[3]types[0] : sublocality
[3]types[1] : political
---------------
[4]short name : 中区
[4]long name : 中区
[4]types[0] : locality
[4]types[1] : political
---------------
[5]short name : 名古屋市
[5]long name : 名古屋市
[5]types[0] : locality
[5]types[1] : political
---------------
[6]short name : 愛知県
[6]long name : 愛知県
[6]types[0] : administrative_area_level_1
[6]types[1] : political
---------------
[7]short name : JP
[7]long name : 日本
[7]types[0] : country
[7]types[1] : political
---------------

※勿論住所が短ければ、配列の数も少なくなる。
「愛知県名古屋市X区XXXN丁目NNN」で終われば、パルコの例よりも配列の要素がひとつ少なくなる。

ナディアパーク
---------------
[0]short name : 伊勢町通り
[0]long name : 伊勢町通り
[0]types[0] : route
---------------
[1]short name : JP
[1]long name : 日本
[1]types[0] : country
[1]types[1] : political
---------------


名古屋市役所
---------------
[0]short name : 460-8508
[0]long name : 460-8508
[0]types[0] : postal_code
---------------
[1]short name : JP
[1]long name : 日本
[1]types[0] : country
[1]types[1] : political
---------------


address_componentsの含まれるshort_namelong_nameについて、「日本」か「JP」の違いしかないようなので、日本ではあまり意味はないか。
typesにはその値の種別が入っていると思っていいのかな?
「日本」が「country」で、「愛知県」が「administrative_area_level_1」か。

…とここまで調べてて、日本語のリファレンスにがっちり載ってたことに気づいた。
http://sites.google.com/site/gmapsapi3/Home/services
折角なので、調べたことは残しておくことにする。

それによると、「administrative_area_level_2」「administrative_area_level_3」まであるようだけど、日本じゃ関係ない。

ただ、これらの結果とリファレンスを見る限り、Google Maps APIのGeocoderを使って緯度経度から住所を取るというのは考え物だと思った。
上の例のように、パルコならまだしも、ナディアパークや市役所のようなパターンになった場合、郵便番号だけだったり、近隣の通りの名前しか取れないパターンがあるんじゃ、判断に困るしなぁ。
例えば一つのresults[]short_nameかlong_nameが三つ以上であれば、それは(それなりの)住所を取得できていると判断するか?



0 コメント | コメントを書く | コメントの表示
2010年2月26日金曜日
ブラウザの違い

いやはや、ハマった。
とりあえずGoogle Maps API v3のテストをしてて、時間があるのでCSSでテストページの見栄えを整えていたら…

その1 何故か、Google Chromeに値がPOSTされない!

ヴァージョンは4.0.249.89。
IEとFirefoxは問題なかったんだけど、何故かchromeだけ$_POSTが空。
で、フォームの値をalert()してやるとダイアログには値が出てくる。
<html>に「xmlns="http://www.w3.org/1999/xhtml"」が指定してあったんだけど(コピペしてきたヤツを元にしているので。僕だったら入れない)、これを削除したら正常に動いた。
「え? これが原因?」と思って「xmlns」を戻したら、正常に値が送られた。
原因はこれじゃないってこと??
ますます判らん。


その2 FirefoxにはinnerText()が使えない。

知るかよ!ってカンジだ。


それだけ。
忘れないようにメモ(とくにその2ね)。
その1は…なんだったんだろう??



0 コメント | コメントを書く | コメントの表示
ルート表示の困った - Google Maps API v3

指定した地点から、指定した距離(km)離れている施設の検索は出来るようになった。
機能的には不要だが、ルート表示をしてみようと思い、サンプルを参考にやってみた。

http://code.google.com/intl/ja/apis/maps/documentation/v3/examples/directions-simple.html

ただこれ、ルートだけじゃなくて、開始位置とゴールにマーカーを置くんだよね。
検索結果として表示している地図には、既にマーカーが置かれてる。だからいちいちAとBのマーカーが置かれると困るんだ。
まぁ、検索範囲の中央を示す地点には(いまのところ)なにも置いてないのでAのマーカーは我慢しようじゃないか。
しかし、ゴールのBのマーカーはいらん!

解決策はないものか?



0 コメント | コメントを書く | コメントの表示
2010年2月24日水曜日
Google Maps API v3で円を描いてみる

郵便番号(三桁、四桁別々)と半径(キロメートル)を入力して、ボタンを押下すると、地図上に円を描くようにしてみる。
忘れないように、とりあえずfunctionだけ書いておく。
JavaScriptは始めたばかりなので、スマートかどうかは自信がない。

参考にしたのはここ。
Circle Object - Google Maps API V3 Reference - Google Maps JavaScript API V3 - Google Code
Maps API V3 Overlays (Google Maps API Version3 日本語ドキュメント(非公式))

Google Maps API V3 Demo Gallery - Google Maps JavaScript API V3 - Google Code
このページにリンクがはってるこのデモが一番参考になるのかな?
Circle Overlay
Drag the marker to move the circle


入力チェックをしてないので、注意すること。
一応、Version3で検証。

var map;
var circle;
// onloadは割愛
function drawCircle(){
// 我ながら値の取得方法については不細工だなぁと
var zip1 = document.getElementsByName('zip1')[0].value;
var zip2 = document.getElementsByName('zip2')[0].value;
var zipcode = zip1 + "-" + zip2;
// Circle Overlayのサンプルに3000kmを3000000と指定していた
// リファレンスを見たら、単位はメートルだったね
var radi = document.getElementsByName('radi')[0].value * 1000;
// 色の指定はテキトー
var circleColor = "#00AAFF";

// 指定された郵便番号から緯度経度を取得する
var geocoder = new google.maps.Geocoder();
geocoder.geocode({address: zipcode}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
// 地図を移動させる
map.setCenter(results[0].geometry.location);
map.setZoom(10);
// 再描画の場合は、一旦前の円を消す
if(circle){
circle.setMap(null);
}
// 円の設定
circle = new google.maps.Circle({
fillColor: circleColor
, strokeWeight: 1
, radius: radi
, center: results[0].geometry.location
});
// 円の描画
circle.setMap(map);
} else {
alert(zipcode + ' not found');
}
});
}


new Circle()するところで、参考にしたデモのソースが「map: map」とかしてたんで何も考えずにそうやってたら、再描画が上手くいかなかった。

とりあえず指定した郵便番号を中心とした円を描いてくれる。新しく郵便番号を入れて実行すれば前のを消して、新しい円を描いてくれる…はず。



0 コメント | コメントを書く | コメントの表示
2010年2月22日月曜日
version3はこっちか

すぐさま更新!

Creating a Store Locator with PHP, MySQL & Google Maps - Google Maps API - Google Code
http://code.google.com/intl/ja/apis/maps/articles/phpsqlsearch_v3.html


version3用はこのページだったね。
HTMLを入れ替えたら動いた。



0 コメント | コメントを書く | コメントの表示
PHPとMySQLで地点検索 - Google Maps API

色々調べてみると、なんか面倒な雰囲気で、さっそく挫折しそう。

Creating a Store Locator with PHP, MySQL & Google Maps - Google Maps API - Google Code
http://code.google.com/intl/ja/apis/maps/articles/phpsqlsearch.html


ググってて出てきたのが上のサイト。ま、Googleからの情報ですけど。

PHPとMySQLでっていうのはいいね。
見てみると、緯度経度をそれぞれFLOATで持つんだね。

CREATE TABLE `markers` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 60 ) NOT NULL ,
`address` VARCHAR( 80 ) NOT NULL ,
`lat` FLOAT( 10, 6 ) NOT NULL ,
`lng` FLOAT( 10, 6 ) NOT NULL
) ENGINE = MYISAM ;


で、ある地点(の緯度経度)から距離を出して、指定した半径(キロメートルorマイル)内のものをピックアップするというSQLがこれ。
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

実際にPHPでやると、こう。
$query = sprintf("SELECT address, name, lat, lng, ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20",
mysql_real_escape_string($center_lat),
mysql_real_escape_string($center_lng),
mysql_real_escape_string($center_lat),
mysql_real_escape_string($radius));
$result = mysql_query($query);


この場合25マイル未満ってこと。ちなみにキロメートルでやるなら3959を6371に置き換えること。

中心となる地点はJavaScriptで取得して、GETでパラメタを送るようだ。

実際に使う場合は画面遷移も必要だし、POSTするだろうから、随分変更点が出てきそう。
とはいえ、緯度経度をFLOATで持っててもOKなら、SQLiteでもなんとかならんかな?


忘れないように、ここにメモしておこう。


メモだけじゃなく、実際にやってみた。
とりあえずコピペして動くかどうかテスト。

環境はXAMPP Lite Windows版で、version 1.7.1。古いのかどうか判りません。

とりあえずデータベースを付属のphpMyAdminから作成した。当然UTF-8ね。
テーブルも、記事にある通りに作る。GUIで作れるけど、SQL文をコピペして作成。
次はデータのインポート…と思ったけど、CSVファイルをインポート出来ないの? インポートする形式のところに上記サイトで見たようなCSVという項目がない!
困った…と思ったら、INSERT文を羅列したファイルが用意されてた。抜かりないな。

さて、データベースの準備は完了。あとはファイルをコピペして作成するだけ。

データベース情報を格納したphpsqlsearch_dbinfo.php、検索ロジックと検索結果をXMLで吐き出すphpsqlsearch_genxml.php、HTMLファイルのphpsqlsearch_map.htmlの三つ。
さすがにphpsqlsearch_dbinfo.phpだけは環境に合わせて書き換えて、保存。当然UTF-8。

出来ました。

お手本サイトどおり、mountain view caで検索すると、ちゃーんとマーカーが出てくる(マウンテンビューで検索してもOKなのはさすがだね)。

var searchUrl = 'phpsqlsearch_genxml.php?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius;

入力した地名から緯度経度を取得して、プルダウンで選択した距離をGETでPHPファイルに送ってるだけ。

最終的に作る(かもしれない)のは検索結果を一覧表示するパターンなので、値をhiddenの項目にでもぶっこんでsubmit()するのがいいかな?(地図を併記する必要がなければ、だけど)
地図や詳細情報を表示するための個別ページは、地点のIDをGETパラメタにでも入れて作るのでいいかな?(是非ブクマしてください!といわんばかりに)

あとは…
郵便番号から検索するパターンか。入力された郵便番号を中心に、一定の範囲を区切って検索するか。どの程度までがリアリティのある範囲なのか、難しいところかな。
郵便番号での周辺検索の範囲って、みんなどうしてるんだろう??

今気づいたけど、これ、version2のコードなんだね。
version3用に書き換えるには、どうすべ? また今度。



0 コメント | コメントを書く | コメントの表示
2010年2月19日金曜日
Google Maps API はじめました

タイトルどおり、今日から始めました。

ソースが読みにくいのはご勘弁。
テンプレートを替えようかな?

開発者ガイド (Google Maps API Version3 日本語ドキュメント(非公式))
http://sites.google.com/site/gmapsapi3/


Geekなぺーじ : Google MAPS APIプログラミング
http://www.geekpage.jp/web/google-maps-api/


とりあえずJavaScriptも覚えないといかんかなぁ?

手始めにversion3の日本語ドキュメントのチュートリアルから始める。
まぁ、ここは表示するだけなので、特に問題はない。

次はイベント。
Google Maps API Version3 イベント (Google Maps API Version3 日本語ドキュメント(非公式))
http://sites.google.com/site/gmapsapi3/Home/mapsapi-v3


「UIイベントの中の引数にアクセスする」という項目がある。
クリックした箇所にマーカーを置いて、そこをブラウザのセンターに持ってくるというヤツ。
折角なので、マーカーに吹き出しを付けてみる。
次の項目「イベントリスナでクロージャを利用する」で吹き出しの出し方が出てるので、流用する。

元のソースはこちら。


function placeMarker(location) {
var clickedLocation = new google.maps.LatLng(location);
var marker = new google.maps.Marker({
position: location
, map: map
});
map.setCenter(location);
}


変更後
function placeMarker(location) {
var clickedLocation = new google.maps.LatLng(location);
var marker = new google.maps.Marker({
position: location
, map: map
});
// マーカーにタイトル(ツールチップ)を追加する
marker.setTitle('テスト');
// 吹き出しの設定
var infowindow = new google.maps.InfoWindow({
content: 'クリックされたのはここです<br>緯度:'
+ location.lat()
+ '<br>経度'
+ location.lng()
, size: new google.maps.Size(50,50)
});
// 吹き出しの表示
infowindow.open(map, marker);
// クリックした箇所をセンターに移動させる
map.setCenter(location);
}

ボチボチいきますか。



0 コメント | コメントを書く | コメントの表示
2010年1月27日水曜日
シビア過ぎる… - xamppでsendmail

いい加減、ローカルでもメールの送信テストが出来るようにと、xamppをあれこれいじってみる。

まずはphp.iniから。
バージョンによって場所が違うかもしれないので、パスは書かない。

[mail function]
という項目があるはず。
とりあえずは以下の項目を編集

[mail function]
; For Win32 only.
SMTP = localhost
smtp_port = 25

; For Win32 only.
;sendmail_from = me@example.com

; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
;sendmail_path = "インストールディレクトリ\sendmail\sendmail.exe -t"


SMTPとsmtp_portには、使用したいメールサーバの設定を記述する。
sendmail_fromはそのままにしておきました。どーせphpで送信する場合にはfromを設定するから。
でもって、sendmail_pathもコメントを外して、パスの確認。

[mail function]
; For Win32 only.
SMTP = smtp.xxxxx.co.jp
smtp_port = 25

; For Win32 only.
;sendmail_from = me@example.com

; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = "インストールディレクトリ\sendmail\sendmail.exe -t"


続いてはsendmailの設定をしたいので、xamppをインストールしたディレクトリ直下にあるsendmailディレクトリのsendmail.iniを開く。

ここでも同じようにsmtp_serverとsmtp_portの設定を行う。php.iniの記述と合わせるのは当然のこと。
hostnameはとりあえずlocalhostのまま。
force_senderは変更してみた。意味があるかどうかは判らないけど。

デバッグログやエラーログが取りたい場合は、debug_logfile、error_logfileの項目のコメントを外して、有効にする。ファイル名だけだから、sendmailディレクトリに出来るんだろう。フルパスや相対パスを書くと変更できるのかな?

念の為、xamppでapacheの再起動(停止→起動)しておく。


で、いよいよテスト。

送信!


…届かない。

小一時間ほどあれこれ試してみましたが、よく判らない。
デバッグログを眺めていると…

10/01/27 10:16:54 ** Cc:
10/01/27 10:16:54 ** Bcc:Content-Type: text/plain; charset=ISO-2022-JP


あ!

改行コードが抜けとるがや!

phpのソースに
."\r\n".
を追加して再度実行してみると、無事に送信できました。

Content-typeの記述を追加した際に、改行コードを付け忘れたってだけか。

ううむ…
そんなヘッダでも送信できてたサーバのsendmailが大雑把なのか、xampp付属のsendmail.exeがシビアなのかどうか…

そもそも記述を間違える僕がいけないっつー話なんだけど。



1 コメント | コメントを書く | コメントの表示
2010年1月15日金曜日
PHPでメールを送るけど、Beckyだけが…

PHPでサイト構築しました。
メールを送るんだけど、まぁこんなカンジ。
抜粋ね。

mb_language('ja');
mb_internal_encoding('UTF-8');
$admin_name = mb_encode_mimeheader($admin_name, 'UTF-8');
$mail_header = "From: ".$admin_name." <".$admin_mail.">\r\n";
$mail_header .= "Content-Type: text/plain; charset=ISO-2022-JP\r\n";
$mail_header .= "Content-Transfer-Encoding: 7bit";
mb_send_mail($mail, $subject, $body, $mail_header);


mb_language()とかmb_internal_encoding()とかは冗長かとは思ったんだけど、改めて指定してみた。

問題は$admin_nameなんだな。
要するに送信者名を日本語で設定したいというので、mb_encode_mimeheader()を使うことになった。

色々とテストしてみると、何故かBecky!だけが化ける。
いくつかのケータイとiphone、Windows Live Mailで試したけど、問題なし。
Becky!だけが問題。

受信メールの一覧、メールのプロパティでは正常に表示されている。
しかしメールを表示する際のミドルバー上の差出人とヘッダ表示ではまともに表示できていない。

試しに返信してみると、宛先の日本語表示は正しい。

色々調べるが、有効な情報は見つからない。

まぁ、Becky!はクセがあるみたいだしなぁ…


じゃ、僕のコードがまずいんだろうなってことで、Content-Typeを消してみたり、Content-Transfer-Encodingを消してみたり色々試したが一向に改善されない。

改めてphpinfo()を確認するが、mb_internal_encodingはUTF-8である。


結論はこれ。
$admin_name = mb_encode_mimeheader($admin_name, 'UTF-8');


ここで指定している'UTF-8'を外すと、Becky!でも正常に表示されました。

$admin_name = mb_encode_mimeheader($admin_name);


$admin_nameで指定している文字コードもUTF-8だし、改めて指定する必要もないかな??
一応Windows Live Mailでも正常に受け取れたし…

なんだったんだろう?
全然ワカラン。

実は根本的なことが判ってないのかも。



0 コメント | コメントを書く | コメントの表示
Template Design: © 2007 Envy Inc.