警告 |
このモジュールは、実験的なものです。これは、これらの関数の動作、関数名は、このドキュメントに書かれて事項と同様に告知なく将来的なPHPのリリースで変更される可能性があります。注意を喚起するとともに、このモジュールは使用者のリスクで使用して下さい。 |
警告 |
このモジュールは、実験的なステータスにあります。関数名/APIは変更 される可能性があります。現在の変換フィルタは日本語のみをサポート しています。 |
全ての文字をシングルバイトで表現可能な言語は数多くあります。マル チバイト文字コードは、多くの言語で文字を表すために使用されていま す。mbstring は日本語文字を処理するために開発 されました。しかし、mbstring 関数の多くは、日 本語以外の文字エンコーディングも処理することが可能です。
マルチバイト文字エンコーディングは、バイトの並びで単一の文字を表 現します。いくつかの文字エンコーディングでは、マルチバイト文字列 の始まり/終わりを表すためにシフト(エスケープ)シーケンスが使用され ています。この場合、マルチバイト文字エンコーディングに対応した方 法でない限り、分割または追加されるとマルチバイト文字列は壊れてし まう可能性があります。このモジュールは、マルチバイト文字列に対応 した文字列関数および変換関数のようなその他のユーティリティ関数を 提供します。
PHPは、基本的にISO-8859-1用に設計されているため、いくつかのマルチ バイト文字エンコーディングは、PHPで正常に動作しません。このため、 mbstring.internal_encoding にPHPで動作する文字 エンコーディングを設定することが必要です。
PHP4の文字エンコーディングに関する規約
バイト毎のエンコーディングである。
シングルバイト文字は、ASCII互換の 00h-7fhの範囲にある。
マルチバイト文字は、00h-7fh以外を使用する。
PHPの内部エンコーディングとして使用可能な文字エンコーディングと 使用できない文字エンコーディングの例を以下に示します。
PHPの内部エンコーディングとして使用できない文字エンコーディングは、 mbstringのHTTP入力/出力変換の機能/関数により変換 することが可能です。
注意 SJIS は、読者がパーサ/コンパイラ、文字エンコーディングと文字エン コーディングの問題点について精通していない限り内部エンコーディン グとして使用するべきではありません。
注意 PHPでデータベースを使用する場合、性能を向上させるためにデータベー スとPHPの内部エンコーディングについて同じ文字エンコーディングを使用 することを推奨します。
PostgreSQLを使用している場合、バックエンドの文字エンコーディング と異なる文字エンコーディングを使用することが可能です。詳細につい ては、PostgreSQLのマニュアルを参照下さい。
mbstring は拡張モジュールです。 configureスクリプトでモジュールを有効にする必 要があります。詳細については、インストールの節を参照下さい。
以下のconfigureオプションがmbstringモジュール に関係するものです。
--enable-mbstring : mbstring 関数を有効にします。このオプショ ンは、mbstring 関数を利用するために必要で す。
--enable-mbstr-enc-trans : mbstring変換エンジンを使用したHTTP入力の文 字エンコーディング変換を有効にします。この機能が有効の場合、 HTTP入力文字エンコーディングは、自動的に mbstring.internal_encodingに変換されます。
HTTP 入出力の文字エンコーディング変換はバイナリデータも変換して しまいます。HTTP入出力にバイナリデータが使用される場合、ユーザは、 文字エンコーディング変換を制御する必要があります。
HTMLフォームのenctypeが multipart/form-dataに設定された場合、 mbstring は、POSTデータの文字エンコーディング を変換しません。この場合、文字列を内部文字エンコーディングに変換 してやる必要があります。
HTTP入力
PHPスクリプトでHTTP入力文字変換を制御する手段はありません。 HTTP入力文字変換を無効にするには、php.ini で行う必要があります。
PHPをApacheモジュールで使用する場合、php.iniの設定を httpd.confにより仮想ホスト単位で、または .htaccessによりディレクトリ単位で上書きす ることが可能です。詳細は、設定 の節およびApacheマニュアルを参照下さい。
HTTP出力
出力の文字エンコーディング変換を有効にする方法は複数あります。 一つ目は php.ini、もう1つは ob_start() で ob_start のコールバック関数として mb_output_handler() を指定するものです。
注意 PHP3-i18nのユーザにとっては、mbstringの出 力変換は、PHP3-i18nとは異なっています。文字エンコーディング は、出力のバッファリング機能を使用して変換されます。
現在、以下の文字エンコーディングがmbstringモ ジュールによりサポートされています。文字エンコーディングは、 mbstring関数のencodingパラ メータで指定することが可能です。
以下の文字エンコーディングがこのPHP拡張モジュールでサポートされ ています。
UCS-4, UCS-4BE, UCS-4LE, UCS-2, UCS-2BE, UCS-2LE, UTF-32, UTF-32BE, UTF-32LE, UCS-2LE, UTF-16, UTF-16BE, UTF-16LE, UTF-8, UTF-7, ASCII, EUC-JP, SJIS, eucJP-win, SJIS-win, ISO-2022-JP, JIS, ISO-8859-1, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5, ISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-10, ISO-8859-13, ISO-8859-14, ISO-8859-15, byte2be, byte2le, byte4be, byte4le, BASE64, 7bit, 8bit, UTF7-IMAP
エンコーディング名を指定可能なphp.ini のエン トリでは、"auto" および "pass" も指定可能です。 mbstring 関数には、エンコーディング名と "auto" を指定可能です。
"pass" が指定された場合、文字エンコー ディング変換は行われません。
"auto" が指定された場合、この文字列 は、"ASCII,JIS,UTF-8,EUC-JP,SJIS"に 変換されます。
mb_detect_order()も参照下さい。
注意 "サポートされる文字エンコーディング" は、内部文字コー ドとして動作するものとは異なります。
mbstring.internal_encoding は内部文字エン コーディングのデフォルト値を定義します。
mbstring.http_input はHTTP入力文字エンコー ディングのデフォルト値を定義します。
mbstring.http_output は、HTTP出力文字エン コーディングのデフォルト値を定義します。
mbstring.detect_order は、文字コード検出の デフォルト値を定義します。 mb_detect_order()も参照下さい。
mbstring.substitute_character は、無効な文 字を代替する文字を定義します。
Webブラウザは、フォームのデータを投稿する際に同じ文字エンコーディ ングを使用すると仮定されます。しかし、ブラウザは同じ文字エンコー ディングを使用しない可能性があります。ブラウザで使用される文字エ ンコーディングを検出するには、mb_http_input() を参照下さい。
HTMLフォームでenctype が multipart/form-data に設定された場合、 mbstringはPOSTデータの文字エンコーディングを 変換しません。ユーザは、変換に応じてスクリプト内で変換を行う必要 があります。
しかし、ブラウザ側でもHTML内の文字エンコーディングを検出すること は可能です。HTMLヘッダでcharsetを設定する方が より良いでしょう。文字エンコーディングに応じて default_charsetを変更して下さい。
例 5 EUC-JP ユーザ用のphp.ini の設定
|
例 6 SJISユーザ用のphp.iniの 設定
|
多くの日本語の文字は1文字あたり複数のバイトを必要とします。加え て、日本語の環境では複数の文字エンコーディング手法が使用されてい ます。使用されているのは、EUC-JP、Shift_JIS(SJIS)、 ISO-2022-JP(JIS) 文字エンコーディングです。Unicodeが普及しつつあ り、UTF-8 も使用されています。日本語環境のWebアプリケーションを 開発するためには、HTTP入出力、RDBMS、e-mailの処理においてそれぞ れに適した文字集合を使用することが重要となります。
1文字は最大6バイトになる
マルチバイト文字は通常シングルバイト文字の2倍の幅となります。 広い幅の文字は「全角」、狭い幅の文字は「半角」と呼ばれます。 通常、「全角」文字は固定幅です。
いくつかの文字エンコーディングでは、マルチバイト文字列を開始/ 終了するためのシフト(エスケープ)シーケンスが定義されています。
SMTP/NNTPでは、ISO-2022-JP を使用する必要があります。
"i-mode" 用Webサイトは、SJISを使用する必要がありま す。
マルチバイト文字エンコーディングと関連する問題は非常に複雑です。 ここで詳細について記述することは不可能です。詳細な事項については、 以下のURLおよび他のリソースを参照下さい。
Unicode/UTF/UCS/等
http://www.unicode.org/
日本語/韓国語/中国語文字に関する情報
ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/cjk.inf