マルチバイト文字列関数(mbstring)

PHP マニュアル
前のページ |  | 次のページ

# LIIマルチバイト文字列関数(mbstring)

# 導入

全ての文字をシングルバイトで表現可能な言語は数多くあります。マル チバイト文字コードは、多くの言語で文字を表すために使用されていま す。`mbstring` は日本語文字を処理するために開発 されました。しかし、`mbstring` 関数の多くは、日 本語以外の文字エンコーディングも処理することが可能です。

マルチバイト文字エンコーディングは、バイトの並びで単一の文字を表 現します。いくつかの文字エンコーディングでは、マルチバイト文字列 の始まり/終わりを表すためにシフト(エスケープ)シーケンスが使用され ています。この場合、マルチバイト文字エンコーディングに対応した方 法でない限り、分割または追加されるとマルチバイト文字列は壊れてし まう可能性があります。このモジュールは、マルチバイト文字列に対応 した文字列関数および変換関数のようなその他のユーティリティ関数を 提供します。

PHPは、基本的にISO-8859-1用に設計されているため、いくつかのマルチ バイト文字エンコーディングは、PHPで正常に動作しません。このため、 `mbstring.internal_encoding` にPHPで動作する文字 エンコーディングを設定することが必要です。

PHP4の文字エンコーディングに関する規約

- バイト毎のエンコーディングである。

- シングルバイト文字は、`ASCII`互換の `00h-7fh`の範囲にある。

- マルチバイト文字は、`00h-7fh`以外を使用する。

PHPの内部エンコーディングとして使用可能な文字エンコーディングと 使用できない文字エンコーディングの例を以下に示します。

    PHPで動作する文字エンコーディング:
    ISO-8859-*, EUC-JP, UTF-8

    PHPで動作しない文字エンコーディング:
    JIS, SJIS

PHPの内部エンコーディングとして使用できない文字エンコーディングは、 `mbstring`のHTTP入力/出力変換の機能/関数により変換 することが可能です。

> 注意 SJIS は、読者がパーサ/コンパイラ、文字エンコーディングと文字エン コーディングの問題点について精通していない限り内部エンコーディン グとして使用するべきではありません。

> 注意 PHPでデータベースを使用する場合、性能を向上させるためにデータベー スとPHPの内部エンコーディングについて同じ文字エンコーディングを使用 することを推奨します。

> PostgreSQLを使用している場合、バックエンドの文字エンコーディング と異なる文字エンコーディングを使用することが可能です。詳細につい ては、PostgreSQLのマニュアルを参照下さい。

# インストール手順

`mbstring` は拡張モジュールです。 `configure`スクリプトでモジュールを有効にする必 要があります。詳細については、インストールの節を参照下さい。

以下のconfigureオプションが`mbstring`モジュール に関係するものです。

- `--enable-mbstring` : `mbstring` 関数を有効にします。このオプショ ンは、`mbstring` 関数を利用するために必要で す。

  > 注意 PHP 4.3.0以降、オプション `--enable-mbstring` はデフォルトで有効となり、中国語、韓国語、ロシア語を サポートするために `--with-mbstring[=LANG]` に変更されます。 日本語の文字エンコーディングはデフォルトでサポートされます。 `--with-mbstring=cn`を 使用した場合、簡体字中国語のエンコーディングがサポートされます。 `--with-mbstring=tw`を 使用した場合、繁体字中国語のエンコーディングがサポートされます。 `--with-mbstring=kr`を 使用した場合、韓国語のエンコーディングがサポートされます。 `--with-mbstring=ru`を 使用した場合、ロシア語のエンコーディングがサポートされます。 If `--with-mbstring=all` が指定された場合、全てのサポートされる文字エンコーディングが 有効となります。しかし、PHPのバイナリサイズは最大となります。 これは、Unicode文字マップのサイズが巨大であるためです。 中国語、韓国語、ロシア語の実験的なサポートはPHP 4.3.0で 追加されたことに注意して下さい。

- `--enable-mbstr-enc-trans` : `mbstring`変換エンジンを使用したHTTP入力の文 字エンコーディング変換を有効にします。この機能が有効の場合、 HTTP入力文字エンコーディングは、自動的に `mbstring.internal_encoding`に変換されます。

  > 注意 PHP 4.3.0以降、このオプション `--enable-mbstr-enc-trans` は廃止され、`mbstring.encoding_translation` に変更となります。HTTP入力文字エンコーディング変換は、 このオプションを`On`に設定した場合のみ 有効となります。 (デフォルトは、`Off`です。)

- `--enable-mbregex` : マルチバイト対応の正規表現関数を使用可能とします。

# 実行用の設定

これらの関数の動作は、`php.ini`の設定により変化します。

表 1Multi-Byte String 設定オプション

名前 | デフォルト | 変更可能な範囲
--- | --- | ---
mbstring.language | NULL | PHP_INI_ALL
mbstring.detect_order | NULL | PHP_INI_ALL
mbstring.http_input | NULL | PHP_INI_ALL
mbstring.http_output | NULL | PHP_INI_ALL
mbstring.internal_encoding | NULL | PHP_INI_ALL
mbstring.script_encoding | NULL | PHP_INI_ALL
mbstring.substitute_character | NULL | PHP_INI_ALL
mbstring.func_overload | "0" | PHP_INI_SYSTEM
mbstring.encoding_translation | "0" | PHP_INI_ALL

PHP_INI_* 定数の詳細及び定義については、ini_set() を参照して下さい。

以下に設定ディレクティブの簡単な説明を書きます。

- `mbstring.language` は、mbstringで使用される 言語のデフォルト値を定義します。このオプションは、 `mbstring.interanl_encoding` のデフォルト値を定義し、`php.ini`において `mbstring.interanl_encoding`は、 `mbstring.language`の後に置く必要があることに 注意して下さい。

- `mbstring.encoding_translation` は、 HTTP入力文字エンコーディング検出および内部文字エンコーディングへの変換 を有効にします。

- `mbstring.internal_encoding` は内部文字エン コーディングのデフォルト値を定義します。

- `mbstring.http_input` はHTTP入力文字エンコー ディングのデフォルト値を定義します。

- `mbstring.http_output` は、HTTP出力文字エン コーディングのデフォルト値を定義します。

- `mbstring.detect_order` は、文字コード検出の デフォルト値を定義します。 mb_detect_order()も参照下さい。

- `mbstring.substitute_character` は、無効な文 字を代替する文字を定義します。

- `mbstring.func_overload`は、シングルバイト対応の 関数をmbstring関数でオーバーロード(置換)します。 mail(), ereg()等は、 mb_send_mail(), mb_ereg()等で 置換されます。使用可能な値は、0, 1, 2, 4 およびこれらのビット和です。 例えば、7 は全てをオーバーロードします。 0: オーバーロード無し(デフォルト), 1: mail()関数を オーバーロード, 2: str*() 関数をオーバーロード, 4: ereg*() 関数をオーバーロード

Webブラウザは、フォームのデータを投稿する際に同じ文字エンコーディ ングを使用すると仮定されます。しかし、ブラウザは同じ文字エンコー ディングを使用しない可能性があります。ブラウザで使用される文字エ ンコーディングを検出するには、mb_http_input() を参照下さい。

HTMLフォームで`enctype` が `multipart/form-data` に設定された場合、 `mbstring`はPOSTデータの文字エンコーディングを 変換しません。ユーザは、変換に応じてスクリプト内で変換を行う必要 があります。

しかし、ブラウザ側でもHTML内の文字エンコーディングを検出すること は可能です。HTMLヘッダで`charset`を設定する方が より良いでしょう。文字エンコーディングに応じて `default_charset`を変更して下さい。

例 1`php.ini` 設定の例
    ; デフォルトの言語を設定
    mbstring.language        = English; 英語に設定 (デフォルト)
    mbstring.language        = Japanese; 日本語に設定

    ;; デフォルトの内部エンコーディングを設定
    ;; 注意: PHPで動作する文字エンコーディングを使用すること
    mbstring.internal_encoding    = UTF-8  ; 内部エンコーディングをUTF-8に設定

    ;; デフォルトのHTTP入力文字エンコーディングを設定
    ;; 注意: スクリプトではhttp_inputの設定は変更できません。
    mbstring.http_input           = pass    ; 変換しない。
    mbstring.http_input           = auto    ; HTTP入力をautoに設定
    	                                ; "auto" は、"ASCII,JIS,UTF-8,
                                            ; EUC-JP,SJIS"に展開されます。
    mbstring.http_input           = SJIS    ; HTTP入力をSJISに設定
    mbstring.http_input           = UTF-8,SJIS,EUC-JP ; 順番を指定

    ;; デフォルトのHTTP出力文字エンコーディングを設定
    mbstring.http_output          = pass    ; 変換せず
    mbstring.http_output          = UTF-8   ; HTTP出力エンコーディングをUTF-8に指定

    ;; デフォルトの文字エンコーディング検出順序を設定
    mbstring.detect_order         = auto    ; デフォルトの順番をautoに設定
    mbstring.detect_order         = ASCII,JIS,UTF-8,SJIS,EUC-JP ; 順番を指定

    ;; 代替文字のデフォルト値を設定
    mbstring.substitute_character = 12307   ; Unicode値を指定
    mbstring.substitute_character = none    ; 文字を出力しない
    mbstring.substitute_character = long    ; longの例: U+3000,JIS+7E7E

例 2`EUC-JP` ユーザ用の`php.ini`の設定
    ;; 出力バッファリングを無効にする
    output_buffering      = Off

    ;; HTTP charsetヘッダを設定
    default_charset       = EUC-JP

    ;; デフォルトの言語を日本語にする
    mbstring.language = Japanese

    ;; HTTP 入力変換を有効にする
    mbstring.encoding_translation = On

    ;; HTTP 入力エンコーディング変換をautoに設定
    mbstring.http_input   = auto

    ;; HTTP出力をEUC-JPに設定
    mbstring.http_output  = EUC-JP

    ;; 内部エンコーディングをEUC-JPに設定
    mbstring.internal_encoding = EUC-JP

    ;; 無効な文字を出力しない
    mbstring.substitute_character = none

例 3`SJIS`ユーザ用の`php.ini`の設定
    ;; 出力のバッファリングを有効に
    output_buffering     = On

    ;; 出力の変換を有効にするために mb_output_handler を設定
    output_handler       = mb_output_handler

    ;; HTTPヘッダ charset を設定
    default_charset      = Shift_JIS

    ;; デフォルトの言語を日本語に設定
    mbstring.language = Japanese

    ;; HTTP 入力変換を有効にする
    mbstring.encoding_translation = On

    ;; HTTP入力エンコーディング変換をautoに設定
    mbstring.http_input  = auto

    ;; SJISに変換
    mbstring.http_output = SJIS

    ;; 内部エンコーディングをEUC-JPに設定
    mbstring.internal_encoding = EUC-JP

    ;; 無効な文字を出力しない
    mbstring.substitute_character = none

# リソース型

この拡張モジュールはリソース型を全く定義し ません。

# 定義済みの定数

これらの定数は、この拡張モジュールで定義されており、 この拡張モジュールがPHP内部にコンパイルされているか実行時に動的にロー ドされるかのどちらかの場合のみ使用可能です。

`MB_OVERLOAD_MAIL` (integer)

`MB_OVERLOAD_STRING` (integer)

`MB_OVERLOAD_REGEX` (integer)

# HTTP入出力

HTTP 入出力の文字エンコーディング変換はバイナリデータも変換して しまいます。HTTP入出力にバイナリデータが使用される場合、ユーザは、 文字エンコーディング変換を制御する必要があります。

HTMLフォームの`enctype`が `multipart/form-data`に設定された場合、 `mbstring` は、POSTデータの文字エンコーディング を変換しません。この場合、文字列を内部文字エンコーディングに変換 してやる必要があります。

- HTTP入力

  PHPスクリプトでHTTP入力文字変換を制御する手段はありません。 HTTP入力文字変換を無効にするには、`php.ini` で行う必要があります。

  例 4`php.ini`でHTTP入力変換を無効にする
      ;; HTTP入力変換を無効にする
      mbstring.http_input = pass
      ;; HTTP入力変換を無効にする (PHP 4.3.0以降)
      mbstring.encoding_translation = Off

  PHPをApacheモジュールで使用する場合、PHP iniの設定を `httpd.conf`により仮想ホスト単位で、または `.htaccess`によりディレクトリ単位で上書きす ることが可能です。詳細は、設定 の節およびApacheマニュアルを参照下さい。

- HTTP出力

  出力の文字エンコーディング変換を有効にする方法は複数あります。 一つ目は `php.ini`、もう１つは ob_start() で `ob_start` のコールバック関数として mb_output_handler() を指定するものです。

  > 注意 PHP3-i18nのユーザにとっては、`mbstring`の出 力変換は、PHP3-i18nとは異なっています。文字エンコーディング は、出力のバッファリング機能を使用して変換されます。

例 5`php.ini` の設定例
    ;; 全てのPHPページで出力の文字エンコーディング変換を有効にする

    ;; 出力バッファリングを有効にする
    output_buffering    = On

    ;; mb_output_handlerによる出力変換を有効にする
    output_handler      = mb_output_handler

例 6スクリプトの例
    <?php

    // このページでのみ出力の文字エンコーディング変換を有効にする

    // HTTP 出力文字エンコーディングをSJISに設定する
    mb_http_output('SJIS');

    // 出力のバッファリングを開始し、コールバック関数として"mb_output_handler"
    // を指定する
    ob_start('mb_output_handler');

    ?>

# サポートされる文字エンコーディング

現在、以下の文字エンコーディングが`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 4.3.0以降、以下の文字エンコーディングのサポートが実験的に 行なわれます。 `EUC-CN`, `CP936`, `HZ`, `EUC-TW`, `CP950`, `BIG-5`, `EUC-KR`, `UHC` (`CP949`), `ISO-2022-KR`, `Windows-1251` (`CP1251`), `Windows-1252` (`CP1252`), `CP866`, `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())をサポートしています。

マルチバイト拡張モジュール(mbstring)では、PHP 4.2.0以降で既存の PHP関数を対応するマルチバイト文字対応版の関数でオーバーロードする 機能をサポートします。関数のオーバーロードを行うと、例えば substr()をPHPスクリプトでコールした場合に、 mb_substr()が代わりにコールされるようになりま す。これにより、マルチバイト文字に対応しないアプリケーションの移 植が容易となります。

関数オーバーロードを使用するには、設定ファイル php.iniの `mbstring.func_overload`ディレクティブに0以外の 値を設定します。設定値によりオーバーロードされる関数の種類が異な ります。メール関数の場合は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文字あたり複数のバイトを必要とします。加え て、日本語の環境では複数の文字エンコーディング手法が使用されてい ます。使用されているのは、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`

前のページ | ホーム | 次のページ
tanh | 上に戻る | mb_convert_encoding