2009年9月24日木曜日

PHPの mbstringの設定の意味についてのメモ

こんな感じ?
PHP5.3の場合だが、5.2でもそんなに違いはないと思う。(mbstring.http_output_conv_mimetypeくらい?)
実際に使う場合は必要に応じて要調査。

[mbstring]
; language for internal character representation.
; http://php.net/mbstring.language
mbstring.language = [(2010/04/26訂正)Japaneseだとmb_send_mail()でメールの文字コードがjisになる。また、文字コード検出順で"auto"を使う場合にもこの設定が必要]

; internal/script encoding.
; Some encoding cannot work as internal encoding.
; (e.g. SJIS, BIG5, ISO-2022-*)
; http://php.net/mbstring.internal-encoding
mbstring.internal_encoding = [mbstring系関数で使われるデフォルトの文字コード]

; http input encoding.
; http://php.net/mbstring.http-input
mbstring.http_input = [入力データを自動で文字コード変換する場合の変換元の文字コード]

; http output encoding. mb_output_handler must be
; registered as output buffer to function
; http://php.net/mbstring.http-output
mbstring.http_output = [ob_start('mb_output_handler')した場合の変換先の文字コード]

; enable automatic encoding translation according to
; mbstring.internal_encoding setting. Input chars are
; converted to internal encoding by setting this to On.
; Note: Do _not_ use automatic encoding translation for
;       portable libs/applications.
; http://php.net/mbstring.encoding-translation
mbstring.encoding_translation = [入力データを自動で文字コード変換するかどうか]

; automatic encoding detection order.
; auto means
; http://php.net/mbstring.detect-order
mbstring.detect_order = [(2010/04/26訂正)変換元文字コードをautoにした場合 一部の関数での文字コード検出の優先順位]

; substitute_character used when character cannot be converted
; one from another
; http://php.net/mbstring.substitute-character
mbstring.substitute_character = [文字コード変換できなかった文字の代替文字]

; overload(replace) single byte functions by mbstring functions.
; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),
; etc. Possible values are 0,1,2,4 or combination of them.
; For example, 7 for overload everything.
; 0: No overload
; 1: Overload mail() function
; 2: Overload str*() functions
; 4: Overload ereg*() functions
; http://php.net/mbstring.func-overload
mbstring.func_overload = [非mbstring系の関数のうちどれをmbstring系の関数で上書きするか]

; enable strict encoding detection.
mbstring.strict_detection = [文字コード変換時に厳密なチェックを行うかどうか]

; This directive specifies the regex pattern of content types for which mb_output_handler()
; is activated.
; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml\+xml)
mbstring.http_output_conv_mimetype = [mb_output_handler()関数が呼び出された場合に使うContent-Typeの正規表現パターンらしい]

; Allows to set script encoding. Only affects if PHP is compiled with --enable-zend-multibyte
; Default: ""
;mbstring.script_encoding = [普通は使わない]

参考:
 PHPの文字化けを本気で解決する - ぎじゅっやさん
 セキュリティ専門家でも間違える!文字エンコーディング問題は難しいのか?
 PHP: 実行時設定 - Manual
 PHP: INIファイル の扱いに関する変更 - Manual

PNGの画像を IE6で透過にするライブラリ調査メモ

IE6では透過PNGが透過しない。それを無理やり透過させてしまうJavaScriptライブラリを調べたメモ。





DD_belatedPNGが一番良さそうかな?


参考:
ITキヲスク | IE6で透過pngを表示させるオススメscript、「DD_belatedPNG.js」

Rails ActiveRecord::Validationsのエラーメッセージを多国語対応するメモ

RailsでActiveRecordのValidationによって生成されるエラーメッセージを翻訳するためのメモ。


方法その1:I18nを使う

所定のYAMLに翻訳部分を記述しておく方法。現在はこれが一番スマートなようだ。
(フィールド名とその後のメッセージの間に半角スペースが入ってしまう?)

参考:
 Rails 2.2.2でエラーメッセージを日本語化する。|WEBデザイン Tips
 Rails 2.2 の ActiveRecord::Validations#add のソースコードを読む - Ruby on Rails 研究 - Ruby on Rails with OIAX



方法その2:GetTextを使う

ActiveRecord::Errorsのdefault_error_messagesをゴリゴリ書き換える方法。
例えば、基本となるModelを作ってその中でメッセージをセットし、他のモデルはそれを継承する方法でもよいと思う。

class BaseModel < ActiveRecord::Base
 ActiveRecord::Errors.default_error_messages[:invalid] = _("がおかしいよ!")
 ActiveRecord::Errors.default_error_messages[:empty] = _("を入力してね!")
 ・
 ・
end
ただし最新のRailsではDeprecation::warnの対象

個々のエラー内容の前に出てくる文(デフォルトでは「<n> errors prohibited this object from being saved」と「There were problems with the following fields:」)は、Module: ActionView::Helpers::ActiveRecordHelperにあるとおり、:header_messageと:messageを指定することにより変えられる。
(2009/10/14追記:Ruby on RailsでRuby-GetText-Packageを使う (Rails-2.3.2以降) - よたらぼ 保管庫に書いてある、「エラーメッセージのタイトル部分をカスタマイズ」のやり方なら、個々のformごとに:header_messageと:messageを指定しなくてすむようだ。)


参考:
 エラーメッセージからフィールド名を取り除く
 ActiveRecord::Errorsあたりのローカライズ - ハードコアシステム開発
 validationのエラーメッセージ(error_messages_for)の日本語化 - Slow Dance
(2009/10/14追加:最新のRails/GetTextについての説明になっていた)
 Ruby on RailsでRuby-GetText-Packageを使う (Rails-2.3.2以降) - よたらぼ 保管庫

Railsで Viewの partialにデータを渡す方法

RailsのViewで部分テンプレートであるpartialを呼び出す場合、呼び出し時に :object または :collection と :locals を渡すことができる。

<%= render :partial => "msg", :object => "データ", :locals => {:name => "他のデータ"} %>

:collection の場合は複数のデータのそれぞれに対して1回ずつpartialが実行される。
<%= render :partial => "msg", :collection => ["データ1", "データ2"] %>

partial側では :object と :collection で渡されたデータは、partialの名前と同じ名前の変数に入っている。
#_msg.html.erb
<%= msg %> <= ここにデータが入っている
<%= name %> <= :localsで渡したデータは指定した名前の変数に入っている。


参考:
UK STUDIO - Railsのpartialの使い方
Ruby On Rails ピチカート街道 - partial パーシャルな関係【partial と object】 -
render :partialカウンター、オブジェクト - ザリガニが見ていた...。

Highslide JSでimage mapのリンクを扱う場合の注意点

Highslide JSは普通のリンクだけでなく、Image Mapのリンクでもページ内ポップアップができる。

しかし、IEで表示した場合、Image Mapのリンクをクリックすると下記の現象が起きる場合がある。

  • リンク(Image Map)の場所に関わらず、「Loading」の表示がページの左上に表示される
  • ポップアップ表示も、ページの左上を基点として拡大・縮小する

Image Mapがページを下にスクロールした位置にある場合、Loadingの表示が無いように見える。


解決策はここに書いてあった。
Highslide JS • View topic - Headline HTML problems with IE while fine in Firefox
Try using highslide-full.js instead of highslide-with-html.js.

highslide-full.jsを使えとのこと。
やってみたら、見事に解決した。


下手にHighslide Configuratorを使わずに、FULLを使った方が無難かも。

ブログ アーカイブ

tags