全ての文字をシングルバイトで一対一表現可能な言語は数多くありますが、 文字表現に単一バイトによる表現範囲を越えるほど多くの文字を必要とする言語も多くあります (1 バイトは 8 ビットから構成されます。各ビットには、1 あるいは 0 の 2 種類の値しか保持できません。そのため、単一のバイトで表すことのできる値は 256 (2 の 8 乗) 種類までとなります)。 マルチバイト文字のエンコーディング法は、 256 を越える文字を通常のビット単位の符号化システムで表現するために開発されました。
マルチバイトエンコーディングで符号化された文字列を (trim, split, splice などで) 処理する際、こうしたエンコーディングでは二つ以上の連続するバイトが 一つの文字を表す可能性があるため、特別な関数を使用する必要があります。 マルチバイトに対応しない文字列関数を文字列に適用した場合、 マルチバイト文字の先頭バイトまたは終了バイトを検出できずに文字列を壊し、 多くの場合には元の意味を失わせてしまう可能性があります。
mbstring はマルチバイト対応の文字列関数を提供し、 PHP でマルチバイトエンコーディングを処理することを容易にします。 それに加えて、mbstring は、 可能な範囲での文字エンコーディングの変換を処理します。 mbstring は UTF-8 や UCS-2 のような Unicode に基づくエンコーディングや多くのシングルバイトエンコーディングを処理するのに便利です (対応するエンコーディングを以下に示します)。
以下の型のエンコーディングが、PHP で安全に使用することができます。
シングルバイトエンコーディングで、
00h から 7fh の範囲の文字に関して、 ASCII 互換 (ISO646 互換) のマッピングを有する。
マルチバイトエンコーディングで、
00h から 7fh の範囲の文字では、 ASCII 互換のマッピングを有する。
ISO2022 エスケープシーケンスを使用しない。
単一の文字を表す複数バイトのいずれにおいても 00h から 7fh の値を使用しない。
PHP で動作しないと思われる文字エンコーディングの例を以下に示します。
これらのエンコーディングで書かれた PHP スクリプトは、 特に符号化された文字列がスクリプトで記述子やリテラルに使用される場合には、 動作しない可能性がありますが、入力される HTTP クエリに関して mbstring の透過的なエンコーディングフィルタを 設定することでこれらのエンコーディングをほとんど使用しないようにすることができます。
注意: SJIS, BIG5, CP936, CP949, GB18030 は、読者がパーサ/コンパイラ、 文字エンコーディングと文字エンコーディングの問題点について精通していない限り 内部エンコーディングとして使用するべきではありません。
注意: PHP でデータベースに接続する場合、性能を向上させるためにデータベースと PHP の内部エンコーディングについて同じ文字エンコーディングを使用することを推奨します。
PostgreSQL を使用している場合、 バックエンドの文字エンコーディングと異なる文字エンコーディングを使用することが可能です。 詳細については、PostgreSQL のマニュアルを参照ください。
mbstring は拡張モジュールです。つまり、デフォルトでは 有効にならないということです。 configure スクリプトでモジュールを有効にする必要が あります。詳細は、インストールの 節を参照してください。
mbstring モジュールに関係する設定オプションは 以下のとおりです。
--enable-mbstring: mbstring 関数を有効にします。このオプションは、 mbstring 関数を利用するために必要です。
mbstring 拡張モジュールを使用するためには、 libmbflライブラリが必要です。 libmbflは、mbstring 拡張モジュールにバンドルされています。システムにインストールされている libmbfl を利用する場合、 --with-libmbfl[=DIR] を指定します。
PHP 4.3.0 以降、mbstring 拡張モジュールは 日本語のほかに中国語 (簡体字)・中国語 (繁体字)・ 韓国語・ロシア語をサポートするように機能拡張されました。
PHP 4.3.4以前のバージョンの場合、 この機能を使用するには、--enable-mbstring=LANGの LANG パラメータに 以下のオプションのいずれかを追加する必要があります。 --enable-mbstring=cn を 使用した場合、簡体字中国語のエンコーディングがサポートされます。 --enable-mbstring=tw を 使用した場合、繁体字中国語のエンコーディングがサポートされます。 --enable-mbstring=kr を 使用した場合、韓国語のエンコーディングがサポートされます。 --enable-mbstring=ru を 使用した場合、ロシア語のエンコーディングがサポートされます。そして、 --enable-mbstring=ja (デフォルト)を 使用した場合、日本語のエンコーディングがサポートされます。 --enable-mbstring=all を指定した場合、サポートされるすべての文字エンコーディングが有効となります。 以前のバージョンとの互換性のため、何もオプションを指定せずに --enable-mbstring を使用した場合は 日本語のエンコーディングがサポートされます。
注意: PHP 4.3.4以降では、--enable-mbstringにより、 libmbflでサポートされている全てのエンコーディングが有効となるよう になっています。
--enable-mbstr-enc-trans : mbstring 変換エンジンを使用した、HTTP 入力の 文字エンコーディング変換を有効にします。この機能が有効の場合、 HTTP 入力文字エンコーディングは、自動的に mbstring.internal_encoding に変換されます。
注意: PHP 4.3.0 以降、このオプション --enable-mbstr-enc-trans は廃止され、実行時の設定 mbstring.encoding_translation に変更となります。HTTP 入力文字エンコーディング変換は、 このオプションを On に設定した場合のみ 有効となります (デフォルトは Offです)。
--disable-mbregex : マルチバイト対応の正規表現関数を無効にします。
php.ini の設定により動作が変化します。
表 1. mbstring 設定オプション
名前 | デフォルト | 変更可能な範囲 | 変更履歴 |
---|---|---|---|
mbstring.language | "neutral" | PHP_INI_PERDIR | PHP 4.3.0 から利用可能です。 |
mbstring.detect_order | NULL | PHP_INI_ALL | PHP 4.0.6 から利用可能です。 |
mbstring.http_input | "pass" | PHP_INI_ALL | PHP 4.0.6 から利用可能です。 |
mbstring.http_output | "pass" | PHP_INI_ALL | PHP 4.0.6 から利用可能です。 |
mbstring.internal_encoding | NULL | PHP_INI_ALL | PHP 4.0.6 から利用可能です。 |
mbstring.script_encoding | NULL | PHP_INI_ALL | PHP 4.3.0 から利用可能です。 |
mbstring.substitute_character | NULL | PHP_INI_ALL | PHP 4.0.6 から利用可能です。 |
mbstring.func_overload | "0" | PHP_INI_PERDIR | PHP 4.2.0 から利用可能で、PHP <= 4.2.3 は PHP_INI_SYSTEM です。 |
mbstring.encoding_translation | "0" | PHP_INI_PERDIR | PHP 4.3.0 から利用可能です。 |
mbstring.strict_detection | "0" | PHP_INI_ALL | PHP 5.1.2 から利用可能です。 |
以下に設定ディレクティブに関する 簡単な説明を示します。
mbstring で使用される言語設定(NLS)のデフォルト値。 この設定は mbstring.internal_encoding を定義するため、 php.ini の中で mbstring.internal_encoding は、 mbstring.language の後に置く必要があることに注意してください。
入力される HTTP クエリに関して、 文字エンコーディング検出および内部文字エンコーディングへの変換を行う 透過的な文字エンコーディングフィルタを有効にします。
内部文字エンコーディングのデフォルト値を定義します。
HTTP 入力文字エンコーディングのデフォルト値を定義します。
HTTP 出力文字エンコーディングのデフォルト値を定義します。
文字コード検出のデフォルト値を定義します。 mb_detect_order()も参照ください。
無効な文字を代替する文字を定義します。
シングルバイト対応の関数を mbstring 関数の対応する関数でオーバーロード (置換)します。詳細は、 関数のオーバーロード を参照してください。
厳密なエンコーディング検出を行います。
HTML 4.01の規約 によると、Web ブラウザは、 フォームのデータを投稿する際にページで使用される文字エンコーディングと 異なるエンコーディングを使用することができます。 ブラウザで使用される文字エンコーディングを検出するには、 mb_http_input() を参照ください。
一般的に使用されるブラウザでは、 指定したHTML文書の文字エンコーディングをかなり正確に推定することができますが、 header() または設定パラメータ default_charset により、 Content-Type HTTP ヘッダで charset を設定する方がより良いでしょう。
例 2. EUC-JP ユーザ用の php.ini の設定
|
例 3. SJIS ユーザ用の php.iniの 設定
|
リソース型は定義されていません。
以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、 実行時に動的にロードされている場合のみ使用可能です。
HTTP 入出力の文字エンコーディング変換はバイナリデータも変換して しまいます。HTTP 入出力にバイナリデータが使用される場合、ユーザは、 文字エンコーディング変換を制御する必要があります。
注意: PHP 4.3.2 およびそれ以前のバージョンの場合、 HTML フォームのenctype が multipart/form-data に設定された場合、 mbstring は、POST データの文字エンコーディングを変換しません。 この場合、文字列を内部文字エンコーディングに変換してやる必要があります。
注意: PHP 4.3.3 以降、HTML フォームの enctype が multipart/form-data に設定され、かつ、 php.ini において mbstring.encoding_translation に On が指定されている場合、 POST データの変数とアップロードされたファイルの名前の文字エンコーディングは、 内部文字エンコーディングに変換されます。 ただし、クエリキーに関しては、変換されません。
HTTP 入力
PHP スクリプトで HTTP 入力文字変換を制御する手段はありません。 HTTP 入力文字変換を無効にするには、php.ini で行う必要があります。
PHP を Apache モジュールで使用する場合、php.ini の設定を httpd.conf により仮想ホスト単位で、または .htaccess によりディレクトリ単位で上書きすることが可能です。 詳細は、設定の節および Apache マニュアルを参照ください。
HTTP 出力
出力の文字エンコーディング変換を有効にする方法は複数あります。 まず php.ini、もうひとつは 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
UTF-16
UTF-16BE
UTF-16LE
UTF-7
UTF7-IMAP
UTF-8
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
HTML-ENTITIES
7bit
8bit
EUC-CN
CP936
HZ
EUC-TW
CP950
BIG-5
EUC-KR
UHC (CP949)
ISO-2022-KR
Windows-1251 (CP1251)
Windows-1252 (CP1252)
CP866 (IBM866)
KOI8-R
エンコーディング名を指定する php.ini エントリには、 "auto" および "pass" を指定することもできます。 エンコーディング名を指定する mbstring 関数にも、"auto" を指定することができます。
"pass" が指定された場合、 文字エンコーディングの変換は行われません。
"auto" が指定された場合、この文字列は "ASCII,JIS,UTF-8,EUC-JP,SJIS" に変換されます。
mb_detect_order() も参照ください。
PHP アプリケーションの多くは、英語等のシングルバイトの言語用に設計されており、 日本語を含むマルチバイト文字列を扱う場合には問題を生じる場合があります。 substr() 等の PHP の文字列関数の多くは、 マルチバイト文字列に対応していません。
マルチバイト拡張モジュール (mbstring) では、文字列を処理する PHP 関数のマルチバイト対応版 (例えば substr() の場合は mb_substr()) をサポートしています。
PHP 4.2.0 以降のマルチバイト拡張モジュール (mbstring) では、 対応するマルチバイト文字対応版の関数で既存の PHP 関数を オーバーロードする機能をサポートします。関数のオーバーロードを行うと、例えば substr() を PHP スクリプトでコールした場合に、 mb_substr() が代わりにコールされるようになります。 これにより、マルチバイト文字に対応しないアプリケーションの移植が容易となります。
関数オーバーロードを使用するには、php.ini の mbstring.func_overload ディレクティブに正の値を指定します。 これは、オーバーロードされる関数の種類を指定するビットマスクの組み合わせとなります。 mail() 関数をオーバーロードするには 1 を指定します。 2 は文字列関数、4 は正規表現関数を表します。つまり、例えば 7 を指定すると、メール関数、文字列関数および正規表現関数が オーバーロードされることになります。オーバーロードされる関数の一覧を以下に示します。
表 2. オーバーロードされる関数
mbstring.func_overload の値 | 元の関数 | オーバーロードする関数 |
---|---|---|
1 | mail() | mb_send_mail() |
2 | strlen() | mb_strlen() |
2 | strpos() | mb_strpos() |
2 | strrpos() | mb_strrpos() |
2 | substr() | mb_substr() |
4 | ereg() | mb_ereg() |
4 | eregi() | mb_eregi() |
4 | ereg_replace() | mb_ereg_replace() |
4 | eregi_replace() | mb_eregi_replace() |
4 | split() | mb_split() |
注意: ディレクトリ単位の設定でこのオプションを使用することは推奨されません。 これは、実際の運用環境ではまだ安定性が確認されておらず、 予期しない結果をもたらす可能性があるためです。
日本語の文字は、マルチバイトエンコーディングを使用しないと表せません。 また、プラットフォームや使用目的によって複数の標準エンコーディングが 使い分けられています。さらに悪いことに、 これらの複数の標準エンコーディングはそれぞれ微妙に異なります。 日本語環境で使用しやすいウェブアプリケーションを作成するには、 これらの複雑な問題を考慮した上で 適切な文字エンコーディングを使用しなければなりません。
1 文字は最大 6 バイトになる
ほとんどの日本語マルチバイト文字は、シングルバイト文字の 2 倍の幅となります。これらの文字のことを、日本語では "全角 (zen-kaku)" と呼びます。これは、 "full width" という意味です。一方、幅の狭い文字のことは "半角 (han-kaku)" と呼びます。これは、 "half width" という意味です。しかしながら、 文字の見た目は、それを表示する際に使用するタイプフェイスに依存します。
いくつかの文字エンコーディングでは、ISO-2022 で定義されたシフト (エスケープ) シーケンスを使用して、特定のコード範囲 (00h から 7fh まで) のコードマップを切り替えます。
SMTP/NNTPでは、ISO-2022-JP を使用する必要があり、ヘッダとエンティティは 各 RFC の規定に基づき再度符号化される必要があります。 これらは必須のものではありませんが、多くの一般的なユーザーエージェントは、 他の符号化手法を認識できないため、行っておく方が良いでしょう。
i-mode, Vodafone live!, または EZweb のような携帯電話サービス用に作成された Web ページは、 Shift_JIS を使用することになります。
マルチバイト文字エンコーディングおよびそれに関連する問題は非常に複雑で、 このドキュメントの範囲を超えています。これらの問題に関連するより詳細な情報は、 以下の URL やその他のリソースを参照ください。
Unicode について
日本語/韓国語/中国語文字に関する情報
サポートされるエンコーディングの概要
IANA文字セット登録名: ISO-10646-UCS-4
依存する文字集合: ISO 10646
説明: The Universal Character Set with 31-bit code space, standardized as UCS-4 by ISO/IEC 10646. It is kept synchronized with the latest version of the Unicode code map.
注記: If this name is used in the encoding conversion facility, the converter attempts to identify by the preceding BOM (byte order mark)in which endian the subsequent bytes are represented.
IANA文字セット登録名: ISO-10646-UCS-4
依存する文字集合: UCS-4
説明: See above.
注記: In contrast to UCS-4, strings are always assumed to be in big endian form.
IANA文字セット登録名: ISO-10646-UCS-4
依存する文字集合: UCS-4
説明: See above.
注記: In contrast to UCS-4, strings are always assumed to be in little endian form.
IANA文字セット登録名: ISO-10646-UCS-2
依存する文字集合: UCS-2
説明: The Universal Character Set with 16-bit code space, standardized as UCS-2 by ISO/IEC 10646. It is kept synchronized with the latest version of the unicode code map.
注記: If this name is used in the encoding conversion facility, the converter attempts to identify by the preceding BOM (byte order mark)in which endian the subsequent bytes are represented.
IANA文字セット登録名: ISO-10646-UCS-2
依存する文字集合: UCS-2
説明: See above.
注記: In contrast to UCS-2, strings are always assumed to be in big endian form.
IANA文字セット登録名: ISO-10646-UCS-2
依存する文字集合: UCS-2
説明: See above.
注記: In contrast to UCS-2, strings are always assumed to be in little endian form.
IANA文字セット登録名: UTF-32
依存する文字集合: Unicode
説明: Unicode Transformation Format of 32-bit unit width, whose encoding space refers to the Unicode's codeset standard. This encoding scheme wasn't identical to UCS-4 because the code space of Unicode were limited to a 21-bit value.
注記: If this name is used in the encoding conversion facility, the converter attempts to identify by the preceding BOM (byte order mark)in which endian the subsequent bytes are represented.
IANA文字セット登録名: UTF-32BE
依存する文字集合: Unicode
説明: See above
注記: In contrast to UTF-32, strings are always assumed to be in big endian form.
IANA文字セット登録名: UTF-32LE
依存する文字集合: Unicode
説明: See above
注記: In contrast to UTF-32, strings are always assumed to be in little endian form.
IANA文字セット登録名: UTF-16
依存する文字集合: Unicode
説明: Unicode Transformation Format of 16-bit unit width. It's worth a note that UTF-16 is no longer the same specification as UCS-2 because the surrogate mechanism has been introduced since Unicode 2.0 and UTF-16 now refers to a 21-bit code space.
注記: If this name is used in the encoding conversion facility, the converter attempts to identify by the preceding BOM (byte order mark)in which endian the subsequent bytes are represented.
IANA文字セット登録名: UTF-16BE
依存する文字集合: Unicode
説明: See above.
注記: In contrast to UTF-16, strings are always assumed to be in big endian form.
IANA文字セット登録名: UTF-16BE
依存する文字集合: Unicode
説明: See above.
注記: In contrast to UTF-16, strings are always assumed to be in big endian form.
IANA文字セット登録名: UTF-8
依存する文字集合: Unicode / UCS
説明: Unicode Transformation Format of 8-bit unit width.
注記: none
IANA文字セット登録名: UTF-7
依存する文字集合: Unicode
説明: A mail-safe transformation format of Unicode, specified in RFC2152.
注記: none
IANA文字セット登録名: (none)
依存する文字集合: Unicode
説明: A variant of UTF-7 which is specialized for use in the IMAP protocol.
注記: none
IANA文字セット登録名: US-ASCII (preferred MIME name) / iso-ir-6 / ANSI_X3.4-1986 / ISO_646.irv:1991 / ASCII / ISO646-US / us / IBM367 / CP367 / csASCII
依存する文字集合: ASCII / ISO 646
説明: American Standard Code for Information Interchange is a commonly-used 7-bit encoding. Also standardized as an international standard, ISO 646.
注記: (none)
IANA文字セット登録名: EUC-JP (preferred MIME name) / Extended_UNIX_Code_Packed_Format_for_Japanese / csEUCPkdFmtJapanese
依存する文字集合: Compound of US-ASCII / JIS X0201:1997 (hankaku kana part) / JIS X0208:1990 / JIS X0212:1990
説明: As you see the name is derived from an abbreviation of Extended UNIX Code Packed Format for Japanese, this encoding is mostly used on UNIX or alike platforms. The original encoding scheme, Extended UNIX Code, is designed on the basis of ISO 2022.
注記: The character set referred to by EUC-JP is different to IBM932 / CP932, which are used by OS/2® and Microsoft® Windows®. For information interchange with those platforms, use EUCJP-WIN instead.
IANA文字セット登録名: Shift_JIS (preferred MIME name) / MS_Kanji / csShift_JIS
依存する文字集合: Compound of JIS X0201:1997 / JIS X0208:1997
説明: Shift_JIS was developed in early 80's, at the time personal Japanese word processors were brought into the market, in order to maintain compatiblities with the legacy encoding scheme JIS X 0201:1976. According to the IANA definition the codeset of Shift_JIS is slightly different to IBM932 / CP932. However, the names "SJIS" / "Shift_JIS" are often wrongly used to refer to these codesets.
注記: For the CP932 codemap, use SJIS-WIN instead.
IANA文字セット登録名: (none)
依存する文字集合: Compound of JIS X0201:1997 / JIS X0208:1997 / IBM extensions / NEC extensions
説明: While this "encoding" uses the same encoding scheme as EUC-JP, the underlying character set is different. That is, some code points map to different characters than EUC-JP.
注記: none
IANA文字セット登録名: Windows-31J / csWindows31J
依存する文字集合: Compound of JIS X0201:1997 / JIS X0208:1997 / IBM extensions / NEC extensions
説明: While this "encoding" uses the same encoding scheme as Shift_JIS, the underlying character set is different. That means some code points map to different characters than Shift_JIS.
注記: (none)
IANA文字セット登録名: ISO-2022-JP (preferred MIME name) / csISO2022JP
依存する文字集合: US-ASCII / JIS X0201:1976 / JIS X0208:1978 / JIS X0208:1983
説明: RFC1468
注記: (none)
IANA文字セット登録名: JIS
依存する文字集合:
説明:
注記:
IANA文字セット登録名: ISO-8859-1
依存する文字集合:
説明:
注記:
IANA文字セット登録名: ISO-8859-2
依存する文字集合:
説明:
注記:
IANA文字セット登録名: ISO-8859-3
依存する文字集合:
説明:
注記:
IANA文字セット登録名: ISO-8859-4
依存する文字集合:
説明:
注記:
IANA文字セット登録名: ISO-8859-5
依存する文字集合:
説明:
注記:
IANA文字セット登録名: ISO-8859-6
依存する文字集合:
説明:
注記:
IANA文字セット登録名: ISO-8859-7
依存する文字集合:
説明:
注記:
IANA文字セット登録名: ISO-8859-8
依存する文字集合:
説明:
注記:
IANA文字セット登録名: ISO-8859-9
依存する文字集合:
説明:
注記:
IANA文字セット登録名: ISO-8859-10
依存する文字集合:
説明:
注記:
IANA文字セット登録名: ISO-8859-13
依存する文字集合:
説明:
注記:
IANA文字セット登録名: ISO-8859-14
依存する文字集合:
説明:
注記:
IANA文字セット登録名: ISO-8859-15
依存する文字集合:
説明:
注記:
IANA文字セット登録名: byte2be
依存する文字集合:
説明:
注記:
IANA文字セット登録名: byte2le
依存する文字集合:
説明:
注記:
IANA文字セット登録名: byte4be
依存する文字集合:
説明:
注記:
IANA文字セット登録名: byte4le
依存する文字集合:
説明:
注記:
IANA文字セット登録名: BASE64
依存する文字集合:
説明:
注記:
IANA文字セット登録名: HTML-ENTITIES
依存する文字集合:
説明:
注記:
IANA文字セット登録名: 7bit
依存する文字集合:
説明:
注記:
IANA文字セット登録名: 8bit
依存する文字集合:
説明:
注記:
IANA文字セット登録名: EUC-CN
依存する文字集合:
説明:
注記:
IANA文字セット登録名: CP936
依存する文字集合:
説明:
注記:
IANA文字セット登録名: HZ
依存する文字集合:
説明:
注記:
IANA文字セット登録名: EUC-TW
依存する文字集合:
説明:
注記:
IANA文字セット登録名: CP950
依存する文字集合:
説明:
注記:
IANA文字セット登録名: BIG-5
依存する文字集合:
説明:
注記:
IANA文字セット登録名: EUC-KR
依存する文字集合:
説明:
注記:
IANA文字セット登録名: UHC (CP949)
依存する文字集合:
説明:
注記:
IANA文字セット登録名: ISO-2022-KR
依存する文字集合:
説明:
注記:
IANA文字セット登録名: Windows-1251 (CP1251)
依存する文字集合:
説明:
注記:
IANA文字セット登録名: Windows-1252 (CP1252)
依存する文字集合:
説明:
注記:
IANA文字セット登録名: CP866 (IBM866)
依存する文字集合:
説明:
注記:
IANA文字セット登録名: KOI8-R
依存する文字集合:
説明:
注記: