ねこすけ LPO 開発メモ

Zend_Json を使うと、 IE で文字化けするサーバがある

PHP のバージョンや PECL のインストール状況によって、Zend_Json の encode メソッドの動作が変わることが原因です。

このメソッドに UTF-8 文字列を渡した場合、json_encode 関数が使える場合は文字列が Unicode エスケープされますが、json_encode 関数が使えない場合は UTF-8 のままとなります。

IE では Unicode エスケープされない文字列を JSON で受け取った場合、「'}' がありません」といったエラーになります。

PHP 5.2.0 以上または、PECL json:1.2.0-1.2.1 をインストールした環境だと正常に動作します。

PHP 5.1.6 の環境では PECL を使って json をインストールするとこの問題は解消されます。

参考までに、CentOS release 5 での対応手順

# yum install php-devel
# pecl channel-update pear.php.net
# pecl install json
# vi /etc/php.d/json.ini
; Enable json extension module
extension=json.so
# /etc/init.d/httpd restart

Zend_Mail を使うと、題名や送信者、受信者の長い日本語が文字化けする

マルチバイト文字列の途中で改行されてしまうのが原因のようなので、Zend_Mail を継承して改修した Necosuke_Mail クラスを作成。使い方は同じ。

  1. <?php
  2. class Necosuke_Mail extends Zend_Mail {
  3. protected function _encodeHeader($value)
  4. {
  5. return sprintf(
  6. "=?%s?B?%s?=",
  7. $this->getCharset(),
  8. base64_encode(mb_convert_encoding($value, $this->getCharset()))
  9. );
  10. }
  11. public function __construct($charset='ISO-2022-JP') {
  12. parent::__construct($charset);
  13. }
  14. public function setBodyText($txt, $charset=null, $encoding=Zend_Mime::ENCODING_7BIT) {
  15. if(!$charset) {
  16. $charset = $this->getCharset();
  17. }
  18. parent::setBodyText(
  19. mb_convert_encoding($txt, $charset),
  20. $charset,
  21. $encoding
  22. );
  23. }
  24. }

Zend_Form にはファイルをアップロードさせるためのエレメントが用意されていない

次のマイナーバージョンアップで Zend_Upload とかいうのを用意するらしいが、待ちきれない。