8ビットの文字をメールで送信するとき

あまり文字のことで悩みたくないが、中国語のメール送信プログラムを書いたときのメモ。

タイトル等ヘッダに関する部分は英語記述で対応することにした。マルチバイトな文字が関係しなければ悩む必要なし。

中国語だと本文は当然漢字になる。日本語みたいにISO-2022-JPに変換しちゃえばいい、という具合でもなさそう。結局こんな具合で送信することにした。

  • 本文($body)はUTF-8とする
  • このままだと8bitでメールを送る可能性があるのでimap_8bit関数で変換した。
    $body=imap_8bit($body);
    ただしimap_8bit関数はIMAPモジュールが必要になる(PHP4以上で使える)。
    PHP5.3以上ならquoted_printable_decode関数のほうがいいかも。

メールヘッダも小細工が必要で、以下のヘッダを付与した。

  • MIME-Version: 1.0
  • Content-Type: text/plain; charset=utf-8
  • Content-Transfer-Encoding: quoted-printable

MIME-Versionは必要ないかもしれない。だけど参考にしたメールソフトではついていたので、とりあえずつけておいた。

MySQL使用時のtimezoneの設定

この前PHPのtimezoneの設定について記述した。この設定は当然PHPスクリプトのみで有効だ。MySQLと連携したシステムを作って、SQL文に日付関連の関数を組み込んだ場合、PHPに処理が渡る前にデータベース操作が終わってしまう。となると、データベース操作で得られる値は、期待したtimezoneでの値とは異なるものになる可能性が高い。そんな時に使うのがこれ。

SET time_zone = ‘+9:00′;

MySQL使用時に「SET NAMES binary;」というおまじないを付ける人も多いと思う。文字化け関連に対応するためにつけるわけだが、やっていることはこれと同じ。「SET」によって環境を設定している。つまりこれにより、一時的にtimezoneに変更を加えることができる。だからPHPからSQL文を発行するときに、毎回このSQL文を一番最初に発行しておいてやれば良さそうだ。

どんな具合に適用されるのかは、しばらく使ってみて確かめることにする。

海外レンタルサーバ3iXを再契約

2010/05/12 | 海外サーバ

アメリカの格安レンタルサーバ3iX。40GB1ドルという超低価格なコースから契約できるレンタルサーバだ。数年前にレンタルしていたけど、用途がなくなってしまったのでそのまま解約したけど、今回再契約した。

海外レンタルサーバ3iX

昔の記事でいろいろ3iXの事を書いたが、ちょっと事情が変わったようだ。コントロールパネルであるcPanelの設定項目が減ったような気がする。当時クレーマーのようにいろいろリクエストをしたからかも。チャットサポートも以前ほどフレンドリーではなくなったような気がする。しかし気にしない。現状特殊なことをするつもりもなく普通にウェブサイトを立ち上げるだけだし。

海外のレンタルサーバだけあって転送速度だけは気にしておかなくてはいけない。セキュリティ面ももちろんだけどそれは日本も同じ(某レンタルサーバでひどい目に会ったから)。転送速度は幾分遅い。これは体感的にわかる。個人的には耐えられないような速度ではないけれど、「おっとり」している、という感じだろうか。HTMLの表示では感じないが、画像がもたついている。FTPも同様で、ややもたつく感じがする。「とにかくサクサク動かないと・・・」という人には勧めにくい。

あと時間帯によって速度に差が出る(これも日本と同じか)。遅くなる時間帯は、今まで使ってみたところでは日本時間の深夜1時頃とかと朝9時頃とか。現地時間だと夕方6時とかと深夜2時くらいになるのだろうか。仕事が終わった後と夜中という時間帯だから、日本と同じような状況なのだろう。

というわけでミッションクリティカルなサイトを運営したい場合はやや危険な感があるが、そうではないサイトなら低価格大容量というサービスは魅力的だ。日本のレンタルサーバでも十分低価格大容量になってきたから、日本のサーバでも十分といえば十分。ただし決定的な違いは「アダルト可」かどうかだ。日本のレンタルサーバなら軒並み不可だ。アダルト可のレンタルサーバになると、価格が上がる(ましてや1ドルで借りられるサーバはない)。日本でも安価なアダルトOKサーバはあるが、そこでひどい目に会ったので、今のところ敬遠している。

PHPの話題とすればphpinfo()の情報となるが、項目はてんこ盛り状態だった(別のサーバなら違う結果になるかもしれないけど)。まぁデータベースが使えて、マルチバイトがOK、curlがOK、simpleXML等XML系が使えれば、後はまぁなんとかなってしまう。ちなみにallow_url_fopenはだめだった。disable_functionsで制御される関数が設定してある(dl, system,  passthru,  popen,  pclose,  proc_open,  proc_nice,  proc_terminate,  proc_get_status,  proc_close,  pfsockopen,  leak,  apache_child_terminate,  posix_kill,  posix_mkfifo,  posix_setpgid,  posix_setsid,  posix_setuid)。system関数は使えないけど、execは大丈夫そう。ただ重い処理を走らせると、すぐに止められるのでこれは意味が無いかもしれない。

まぁ、徐々に様子を見ていくことにする。

海外レンタルサーバ3iX

timezoneを設定する

故あって久々に海外サーバを使うことになった。海外サーバは安価で大容量という点がいいのだが、さしあたって2点問題がある。

まず一つ目は速度が期待できないこと。こればかりはどうしようもない。サーバ側でのプログラムの処理速度は問題ないが、距離が遠い分表示に時間がかかる。試してみたら、HTMLのみなら容量もそれほど大きいわけではないのでそれほどでもないが、画像等のバイナリを扱うと遅さがわかってしまう。しかし、こればかりはどうしようもない。画像そのもののサイズを小さくするしかない。

もう一つ。時刻の設定が問題。海外設置のサーバでは、専用サーバやVPSでもない限り現地時刻で設定してあるので、単純に現在日時を表示しようとすると、現地時間で表示されてしまう。かといって時差を考慮して足し算引き算をするのはもっとダメ。サマータイムとか考慮することを考えるととても複雑だし、汎用化するために関数化するのはプログラムの本質から離れてしまうような気がするのでNG。

でも実は簡単だった。プログラム自体は何も考慮せず作り、プログラムの先頭におまじないをつければよい。

putenv(‘TZ=JST-9′);

この1行を書いておくだけで、プログラムは日本時間で処理してくれる。環境変数のことを考慮するようなことってあまりないが、Tipsとして知っておくと便利な機能だ。

CSVで先頭が0で始まる数字を吐き出すときに

2010/04/24 | その他

データベースなどからエクセル用にCSVを吐き出すのはよくある処理だ。でも、昔から困っていたことがあって、電話番号の出力で大抵、問題が起きる。

例えば「03」というデータをCSVで普通に書き出して、エクセルで自動で読み込ませると、「3」に変換されてしまうのだ。例えば拡張子をdat等にしておき、エクセルをあらかじめ開いておいて、「ファイル」メニューから「開く」を選択し、「ファイルの種類」を「すべてのファイル」にして、テキストファイルウィザードを起動し、各カラムの形式を設定しつつ・・・ということをすれば、「03」と表示させることができる。今まではクライアントに「こうやってください」とお願いしてきた。しかし、これ、面倒。

拡張子をcsvにしてファイルを保存すると、そのファイルをダブルクリックすれば自動でエクセルがCSVを読み込んでくれる(もちろんエクセルがインストールされていればの話だが)。こういうことに慣れているわけだから、単にダブルクリックで開くだけでうまくいかないものか、とかねがね考えていた。「自動変換しない」とかのキーワードで検索したりしたけど、うまく見つけられなかった。

では、そのようなことが出来るのだろうか。答えはできる。CSVで出力するときはカンマ区切りのデータを作成する。で、各値は数字ならそのまま、文字列ならダブルクオーテーションでくくる。問題の0で始まる数字。これは以下のように書く(2つ目の項目)。

1, =”03″, “文字列”

当該文字列をダブルクォーテーションでくくり、前に=(イコール)を付ける。これでOKになる。今まで如何に調べ方が下手だったのかわかる。だってこんな簡単なことなのに・・・。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net