========================================== パッケージについて ========================================== ■ パッケージの名称と配布場所 名称 php-3.0.15-i18n-ja 配布場所 http://www.happysize.co.jp/techie/php-ja-jp/ ftp://ftp.happysize.co.jp/php-ja-jp/ http://php.jpnnet.com/ ■ このパッケージは何? PHPで複数のエンコーディング(SJIS, EUC, UTF-8, JIS)を容易に操作できるよ うにした国際化バージョンです。現在は日本語しかサポートしてません。 不具合や不都合を発見された場合は、PHP-jp MLまでメールでご報告くださるよう お願いします。公開の場所にメールを出すことを躊躇される場合は、下記の連絡 先メールアドレスまでメールを下さってもかまいませんが、個別の対応はできな い場合がありますのでご了承ください。 PHP-jp ML mailto:PHP-jp@sidecar.ics.es.osaka-u.ac.jp http://sidecar.ics.es.osaka-u.ac.jp/php-jp/ ■ 保証と著作権 このソフトウェアには保証はありません。ご自分の責任において使用してくださ い。 著作権については、各ソースファイルに記述された内容を参照してください。一 般的に、各プログラムの著作権は、その作者が保有しています。著作権を保有し ている人から提示された条件を満たさない限り、そのプログラムを使用すること は許されません。 ■ 再配布 各ソースファイルに記述されたとおり、このパッケージの一部または全部を再配 布することは、一定の条件を満たした上で自由です。 しかし、特にこのパッケージがベータ版であることもあり、なるべく、パッケー ジ全体を配布してくださるようお願いいたします。また、開発者としては、パッ チ(PHP3本体に対するdiff)として流通されることは望んでいません。今後数多 くの方々が議論し、著作をなし、発展させる対象となり得る単一の基点を手に入 れたいと考えます。そのため、今の時点では、パッチにパッチを重ねることによ る少しづつ異なるバージョンの発生はあまり望みません。 ■ だれが作ったの? 有志が集まり「PHP3国際化チーム」として活動しています。このチームとPHP3開 発チームとの特定の関係はありませんが、すでにPHP3開発チームに連絡済みであ り、将来はPHP3の本体に取りこんでもらうことを期待しています。将来、PHP3の 本体に取りこんでもらうことを想定し、日本語に限定しない「国際化」もしくは 各国語化に対応できるプラットフォームを作成することを目標としています。 協力してくださる方はご連絡下さい。 連絡先メールアドレス phpjdev@kage.net ウェブページのURL http://php.jpnnet.com/ 目標とする仕様書 http://www.happysize.co.jp/techie/php-ja-jp/spec.htm 参加者および担当分野 佐藤 裕紀 ウェブページ、開発者用ML管理、開発、全体設計 金本 茂 文字コード変換フィルタ、その他若干 Tsukada Takuya U.Kenkichi 舘山 その他の方々 ■ 今後の課題 ・仕様書への合致 ・日本語以外のサポート ・日本語用部分の共有ライブラリ化? ・MBCS用文字列操作関数(PHP3関数)の追加。 ・日本語専用文字列操作関数の追加。 ・テストたくさん。 ■ Special Thanks to PHPのページの広川さん http://www.cityfujisawa.ne.jp/%7Elouis/apps/phpfi/ PHP-JP MLの山本さん http://sidecar.ics.es.osaka-u.ac.jp/php-jp/ これまでのパッチの:くわむらさん、前田さん、浦栃さん、山本さん、村上さん、 内田さん、他の方々 ========================================== 国際化対応版を使用する利点 ========================================== ・スクリプトファイル、HTTP出力とで個別の文字コードを使用することができる。 ・POST/GET/COOKIEで受け取った値の文字コードを推定することができる。 ・文字列に対する文字コード変換機能(PHP3関数)。 ・メール送信。本文はJIS、SubjectヘッダはMIME/Base64/JISで。 ・HTTP出力のContent-Typeがtext/htmlの場合、適切なcharsetが自動的に指定される。 ・安定した文字コード変換。 ・マルチバイト正規表現 ========================================== 作成方法 ========================================== ■ 概要 configureに対して--enable-i18nというオプションを追加して実行してください。 その他のオプションについては、利用する環境にしたがって通常通り指定してく ださい。 php3.ini-distを適切な場所(/usr/local/lib/php3.iniなど)にコピーするのを お忘れなく。すでにPHP3を使っている環境の場合は、php3.ini-distから、 i18n. で始まる行をコピーしてください。 ■ configure のオプション --enable-i18n 国際化機能を組み込む --enable-mbregex マルチバイト文字対応正規表現ライブラリを組み込む (国際化機能を組み込まない場合には mbereg() 等の PHP関数は機能しません) ■ CGI版の作成例 % tar xvzf php-3.0.15-i18n-ja.tar.gz % cd php-3.0.15-i18n-ja % ./configure --enable-i18n --enable-mbregex % make ■ Apache版の作成例 % tar xvzf php-3.0.15-i18n-ja.tar.gz % tar xvzf apache_1.3.x.tar.gz % cd apache_1.3.x % ./configure % cd ../php-3.0.15-i18n-ja % ./configure --with-apache=../apache_1.3.x --enable-i18n --enable-mbregex % make % make install % cd ../apache_1.3.x % ./configure --activate-module=src/modules/php3/libphp3.a % make % make install ■ Apache DSO版の作成例(可能ならこれが一番ラク) 先にDSO機能付きのApacheを作っておく。 % tar xvzf apache_1.3.x.tar.gz % cd apache-1.3.x % ./configure --enable-shared=max % make % make install ここからがPHP3 % cd php-3.0.15-i18n-ja % ./configure --with-apxs=/usr/local/apache/bin/apxs --enable-i18n \ --enable-mbregex % make % make install ========================================== 注意点 ========================================== ■ 正規表現ライブラリについて マルチバイト文字用の正規表現ライブラリとして "Ruby" で使用されている ものを組み込みました。 これによりEUC-JP、SJIS、UTF-8で正規表現が使えるようになります。 この正規表現ライブラリをPHPに組み込むにあたり、Apacheに付属の"HSREGEX" やシステム付属のライブラリとの競合をさけるため、関数名などを独自のもの に変更しました。ですから PHP の関数もオリジナルの ereg()などとは別に mbereg()等を用意しました。 使用する文字コードは i18n.internal_encoding (後述)の設定値により 起動時に初期化されます。 ■ バイナリデータの出力(GDなどを使用する場合)について HTTP出力コードをpass以外に指定した場合、「内部コード」からHTTP出力コードへ のコード変換が自動的に行われます。この結果、バイナリデータを出力したい場合 に、期待しないコード変換が行われてデータが壊れてしまいます。このような場合 には、HTTP出力コードをpassに指定してください。 例 ■ Content-Typeについて 設定したHTTP出力コードに従って適切な Content-Type: text/html; charset="..." を出力する機能が付加されています。次の点に注意してください。 ・header()関数によってContent-Typeヘッダを設定した場合はそちらが優先されます。 ・スクリプト中でi18n_http_output()関数によって設定する場合は、それよりも  前に何らかのデータが出力されることの無いようにしてください。何らかのデー  タが出力される瞬間に全てのヘッダが準備され、出力されます。 ■ 問題への対処 何か問題が起きた場合は、どのような条件で起きるのかなどを調べた上で、上記 の方法でご連絡下さいますようお願いします。サンプルのスクリプトを添付して くださると助かります。 なお、Segmentation Violationなどメモリ関連のトラブルが発生する場合は、 ./configureに--enable-debugオプションをつけてビルドしてから動作させると、 詳細なエラーメッセージが得られます。CGI版の場合はHTTP出力に、Apache版の 場合はApacheのエラーログに出力されます。 ========================================== php3.ini 設定ファイルへの記述 ========================================== 以下のキーワードと値をphp3.iniファイルに記述することで、デフォルトの動作 を指定します。これはphp3.iniのglobalセクション(tmp directoryなどを指定す るブロック)に記述します。 キーワードの大文字、小文字は無視されます。 ■ 設定ファイルおよびPHP関数で使用する文字コード名称 名称には正式名称、エイリアス、MIME名称の3種類があります。 ・文字コード(エンコーディング)名称の一覧 - UTF-8 正式名称 : UTF-8 エイリアス : "無し" MIME名称 : UTF-8 - ASCII 正式名称 : ASCII エイリアス : "無し" MIME名称 : US-ASCII - 日本語EUC 正式名称 : EUC-JP エイリアス : EUC, EUC_JP, eucJP, x-euc-jp MIME名称 : EUC-JP - シフトJIS 正式名称 : SJIS エイリアス : x-sjis, MS_Kanji MIME名称 : Shift_JIS - JIS 正式名称 : JIS エイリアス : "無し" MIME名称 : ISO-2022-JP - Quoted-Printable 正式名称 : Quoted-Printable エイリアス : qprint MIME名称 : "無し" - BASE64 正式名称 : BASE64 エイリアス : "無し" MIME名称 : "無し" - 無変換 正式名称 : pass エイリアス : none MIME名称 : "無し" - 入力自動判定 正式名称 : auto エイリアス : unknown MIME名称 : "無し" ■ i18n.http_output デフォルトのHTTP出力コードの指定 i18n.http_output = EUC-JP|SJIS|JIS|UTF-8|pass EUC-JP : EUC SJIS: SJIS JIS : JIS UTF-8: UTF-8 pass: 無変換 指定が無い場合は無変換です(内部コードがそのまま出力される)。 i18n_http_output()関数で一時的に変更することができます。 この設定値が i18n.internal_encoding の文字コードと異なる場合は 出力の際に文字コードの変換が行われます。 ■ i18n.internal_encoding 内部コードの指定 i18n.internal_encoding = EUC-JP|SJIS|UTF-8 EUC-JP : EUC SJIS: SJIS UTF-8: UTF-8 指定が無い場合はEUC-JPです。 PHP のパーサは ISO-8859-1 を前提に作られているのだと考えられます。 それ以外のエンコーディングについては ・バイト単位のエンコーディング ・シングルバイト文字の 00h〜7Fh が ASCII と互換性がある ・マルチバイト文字の中に 00h〜7Fh が現れない の条件を満たしていれば問題無く使えると思います。 日本語では EUC-JP と UTF-8 になります。 i18n.internal_encoding と i18n.http_output が異なる場合には 出力の際に変換されますが、スクリプト上で URLエンコード、BASE64、 Quoted-Printable などの変換を行ってしまうと、 その部分は i18n.internal_encoding のままになります。 ですから文字列に何らかの変換を加える前には i18n_convert()で i18n.http_output のエンコーディングに変換すると問題が起こる 可能性が低くなります。 例) $str = urlencode( i18n_convert($str, i18n_http_output()) ); また、内部コードで ISO-2022-**、HZエンコーディング 等のように シフトシーケンスを使用して文字セットを切りかえるエンコーディング は使用できません。そのようなエンコーディングの問題点は、 ・パーサーでエラーになる。 ・magic_quotes_***で文字列が壊れる。(SJISでも問題あり?) ・文字処理関数、正規表現関数が正常に動作しない。 ■ i18n.script_encoding スクリプトファイルのコードの指定 i18n.script_encoding = auto|EUC-JP|SJIS|JIS|UTF-8 auto: 自動判定 EUC-JP : EUC SJIS: SJIS JIS : JIS UTF-8: UTF-8 指定が無い場合はautoです。 ファイルから読み込んだ文字列はパーサに入る前にi18n.internal_encoding で指定した内部コードに変換されます。 この設定を auto とする場合の注意点として、 文字コードの "自動判定" は失敗する場合もあります!! auto の設定でマルチバイト文字列を使う場合には、スクリプトの始めに マルチバイト文字列のコメントを書いておいて、確実にエンコーディング の判定が行われるようにしておくと良いでしょう。 ■ i18n.http_input HTTPからの入力の取り扱いの指定 i18n.http_input = pass|auto auto: 自動判定 pass: 無変換 指定が無い場合はautoです。 pass を指定した場合は変換を行いません。 auto を指定した場合は入力の文字コードを判定します。 文字コードが確定できた場合には、その文字コードから内部コードへ 変換が行われます。確定できない場合は i18n.http_input_default の 設定により処理されます。 ■ i18n.http_input_default HTTPからの入力のデフォルト i18n.http_input_default = pass|EUC-JP|SJIS|JIS|UTF-8 pass: 無変換 EUC-JP : EUC SJIS: SJIS JIS : JIS UTF-8: UTF-8 指定が無い場合は pass です。 この設定は i18n.http_input が auto の場合のみ有効です。 入力の文字コードが確実に判定できない場合には、文字コードが この設定値であるものとして処理を行います。 pass を指定した場合は変換を行いません。 EUC-JP、SJIS、JIS、UTF-8 を指定した場合はこれらの文字コードから 内部コードへの変換が行われます。 ■ 設定例 1) これは設定の自由度と、これまでに分かっているさまざまな問題を 考慮したもので、これを使いこなせばベストだと思います。 しかし文字コードや HTTP に関して知識が少ないと問題が 起こった時に原因の究明が難しいかもしれません。 i18n.http_output = SJIS i18n.internal_encoding = EUC-JP i18n.script_encoding = auto i18n.http_input = auto i18n.http_input_default = SJIS 2) 原因不明の問題に悩みたくなければ、この設定で開発するのが 良いかもしれません。 i18n.http_output = pass i18n.internal_encoding = EUC-JP i18n.script_encoding = pass i18n.http_input = pass i18n.http_input_default = pass ========================================== PHP関数 ========================================== 以下にPHPに追加された関数と使用法を示します。 キーワードの大文字、小文字は無視されます。 ■ i18n_http_output(文字コード) ■ 文字コード = i18n_http_output() HTTP出力の文字コードを設定します。以降、ここで指定した文字コードで出 力されます。また、引数を指定しないで呼び出すと、現在使用されている HTTP出力の文字コードの名称が文字列として返されます。 文字コード EUC-JP : EUC SJIS: SJIS JIS : JIS UTF-8: UTF-8 pass: 無変換 ■ 文字コード = i18n_internal_encoding() 現在の「内部コード」の名称が文字列として返されます。 内部コード EUC-JP : EUC SJIS: SJIS UTF-8: UTF-8 ■ 文字コード = i18n_http_input() HTTP入力の文字コード判定結果が返されます。 文字コード EUC-JP : EUC SJIS: SJIS JIS : JIS UTF-8: UTF-8 pass: 無変換(i18n.http_inputでpassとした場合) ■ 文字列 = i18n_convert(文字列, 文字コード) ■ 文字列 = i18n_convert(文字列, 文字コード, 変換前の文字コード) 文字列を指定した文字コードに変換します。変換前の文字コードを指定しな い場合は、文字列が現在の「内部コード」で記憶されているものとして変換 します。 文字コード EUC-JP : EUC SJIS: SJIS JIS : JIS UTF-8: UTF-8 pass: 無変換 変換前の文字コード EUC-JP : EUC SJIS: SJIS JIS : JIS UTF-8: UTF-8 pass: 無変換 auto: 自動認識 ■ 文字コード = i18n_discover_encoding(文字列) 文字列の文字コードを判定します 文字コード EUC-JP: EUC SJIS: SJIS JIS : JIS UTF-8: UTF-8 ASCII: ASCII(09h, 0Ah, 0Dh, 20h-7Ehのコードのみ) pass: 判定不可(文字列が短い場合など) unknown: 不明(処理のエラー等も含む) ■ 整数 = mbstrlen(文字列) ■ 整数 = mbstrlen(文字列, 文字コード) 文字列に含まれる文字の数を答えます。文字コードを指定しない場合は、文 字列が現在の「内部コード」で記憶されているものとして処理します。 文字コード EUC-JP : EUC SJIS: SJIS JIS : JIS UTF-8: UTF-8 auto: 自動認識 ■ 整数 = mbstrpos(文字列1, 文字列2) ■ 整数 = mbstrpos(文字列1, 文字列2, 開始位置) ■ 整数 = mbstrpos(文字列1, 文字列2, 開始位置, 文字コード) strpos()と同等の処理を、文字数に基づいて行います。文字コードを指定し ない場合は、文字列が現在の「内部コード」で記憶されているものとして処 理します。 文字コード EUC-JP : EUC SJIS: SJIS JIS : JIS UTF-8: UTF-8 ■ 整数 = mbstrrpos(文字列1, 文字列2) ■ 整数 = mbstrrpos(文字列1, 文字列2, 文字コード) strrpos()と同等の処理を、文字数に基づいて行います。文字コードを指定し ない場合は、文字列が現在の「内部コード」で記憶されているものとして処 理します。 文字コード EUC-JP : EUC SJIS: SJIS JIS : JIS UTF-8: UTF-8 ■ 文字列 = mbsubstr(文字列, 位置) ■ 文字列 = mbsubstr(文字列, 位置, 長さ) ■ 文字列 = mbsubstr(文字列, 位置, 長さ, 文字コード) substr()と同等の処理を、文字数に基づいて行います。文字コードを指定し ない場合は、文字列が現在の「内部コード」で記憶されているものとして処 理します。 文字コード EUC-JP : EUC SJIS: SJIS JIS : JIS UTF-8: UTF-8 ■ 文字列 = mbstrcut(文字列, 位置) ■ 文字列 = mbstrcut(文字列, 位置, 長さ) ■ 文字列 = mbstrcut(文字列, 位置, 長さ, 文字コード) substr()と同様の処理を行いますが、位置がマルチバイト文字の2バイト目 以降の場合はその文字の1バイト目から始め、長さに収まり、且つマルチバ イト文字またはシフトシーケンスの途中とならない最大の位置まで文字列を 切り取ります。文字コードを指定しない場合は、文字列が現在の「内部コード」 で記憶されているものとして処理します。 文字コード EUC-JP : EUC SJIS: SJIS JIS : JIS UTF-8: UTF-8 ■ 文字列 = i18n_mime_header_encode(文字列) 文字列をMIMEヘッダーエンコードします。(=?ISO-2022-JP?B?[文字列]?=の形式) ■ 文字列 = i18n_mime_header_decode(文字列) MIMEヘッダーエンコードされた文字列をデコードします。 ■ 文字列 = i18n_ja_jp_hantozen(文字列) ■ 文字列 = i18n_ja_jp_hantozen(文字列, オプション) ■ 文字列 = i18n_ja_jp_hantozen(文字列, オプション, 文字コード) 文字列の半角と全角の変換をします。 オプション 下記文字の組み合わせで指定。デフォルト "KV" "r" : 英字を全角から半角に変換 "R" : 英字を半角から全角に変換 "n" : 数字を全角から半角に変換 "N" : 数字を半角から全角に変換 "a" : 英数字(21h - 7Eh)を全角から半角に変換 "A" : 英数字(21h - 7Eh)を半角から全角に変換 "k" : 全角カタカナを半角カナに変換 "K" : 半角カナを全角カタカナに変換 "h" : 全角ひらがなを半角カナに変換 "H" : 半角カナを全角ひらがなに変換 "c" : 全角カタカナを全角ひらがなに変換 "C" : 全角ひらがなを全角カタカナに変換 "V" : 濁音記号を貼り付けて一文字にする、"K"、"H"と組み合わせて使用 文字コード 文字コードを指定しない場合は、文字列が現在の「内部コード」で記憶され ているものとして処理します。 EUC-JP : EUC SJIS: SJIS JIS : JIS UTF-8: UTF-8 ■ 整数 = mbereg(正規表現, 文字列, [一致配列]) ■ 整数 = mberegi(正規表現, 文字列, [一致配列]) ereg()、eregi()のマルチバイト文字対応版 ■ 文字列 = mbereg_replace(正規表現, 置換文字列, 文字列) ■ 文字列 = mberegi_replace(正規表現, 置換文字列, 文字列) ereg_replace()、eregi_replace()のマルチバイト文字対応版 ■ 配列 = mbsplit(正規表現, 文字列, 上限値) split()のマルチバイト文字対応版 ========================================== FAQ (よくある質問) ========================================== ここではPHP-jpでとりあげられた問題などを簡単にまとめてみました。 ■ GETメソッドに日本語を使う PHPに何らかの処理をさせてアンカーに「xxxx.php?data=日本語」を指定する 場合、PHPでurlencodeをしてください。urlencodeをしないと、ブラウザによっ ては正しくデータを渡せなくなります。 例:Link ■ 一部の文字の後に必ず`\'がつく 内部エンコードをShift_JISにしたとき、一部の文字の後に必ず`\'がついたり、 それ以外の場合でも`"'などの文字が`\"'のようにクォートされる。 PHPの設定であるmagic_quotes_gpcがデフォルトで有効(On)になっているのが 原因です。php3.ini(もしくは、.htaccess)の設定を無効(Off)にするか、スク リプト側で、StripSlashes関数を使うことによって取り除くことが出来ます。 また、日本語文字列だけ取り除くには、$quote_strが、Shift_JISで表現されて いるならば ereg_replace関数を用いて、 ereg_replace(sprintf("([%c-%c%c-%c]\\\\)\\\\",0x81,0x9f,0xe0,0xfc), "\\1",$quote_str); とすれば、可能です。 Shift_JISでの「一部の文字」の例(部分): ―⊇そソЫ綾噂化浬棺欺興圭現構砂蚕悉十晶申製曾遜箪捗貼峠能判表塀暴冥予僚禄 ■ PHPをソースからインストールする際、makeにRE_CHAR_CLASSエラー システムの正規表現がapacheに組み込まれており、これが日本語対応の正規 表現とぶつかってます。お手数ですが、apacheをconfigureから作り直し、 --disable-rule=WANTHSREGEXを使わない様にしてください。 ■ たまにPOSTで渡したデータがおかしい(コード認識問題) もしi18n_http_input()がpassを返してくるようでしたら、漢字のコード認識が できなかった事です。これはSJISとEUCのコードが非常に似ている為発生する 現象であり、長めの日本語テキストをで 隠し渡してあげると解決します。 ========================================== 日本語マニュアル ========================================== "PHP3 日本語マニュアル作成プロジェクト"の方々が翻訳されたマニュアルを このパッケージに収録させていただきました。 マニュアルはHTMLで"doc-jp"ディレクトリにあります。 "manual.html"がトップページになります。 "PHP3 日本語マニュアル作成プロジェクト"に関しては下記 URL を参照下さい。 http://www.cityfujisawa.ne.jp/%7Elouis/apps/phpfi/ * オリジナルの英文マニュアルは"doc"ディレクトリにあります。