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 スクリプトでモジュールを有効にする必要が あります。詳細は、 インストール の 節を参照して下さい。

以下の設定オプションが mbstring モジュールに関係し ています。

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

    注意 PHP 4.3.0以降、オプション --enable-mbstring は、中国語、韓国語、ロシア語をサポートするために --enable-mbstring[=LANG] に変更されます。 日本語の文字エンコーディングはデフォルトでサポートされます。 --enable-mbstring=cn を 使用した場合、簡体字中国語のエンコーディングがサポートされます。 --enable-mbstring=tw を 使用した場合、繁体字中国語のエンコーディングがサポートされます。 --enable-mbstring=kr を 使用した場合、韓国語のエンコーディングがサポートされます。 --enable-mbstring=ru を 使用した場合、ロシア語のエンコーディングがサポートされます。 --enable-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フォームで enctypemultipart/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フォームの enctypemultipart/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 、もう1つは 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を 指定すると全てのメール、文字列、正規表現関数をオーバーロードしま す。オーバーロードされる関数を下表に示します。



日本語のマルチバイト文字に関する基本事項

多くの日本語の文字は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



目次
mb_convert_case -- 文字列に対してケースフォルディングを行う
mb_convert_encoding -- 文字エンコーディングを変換する
mb_convert_kana -- カナを("全角かな"、"半角かな"等に)変換する
mb_convert_variables -- 変数の文字コードを変換する
mb_decode_mimeheader -- MIMEヘッダフィールドの文字列をデコードする
mb_decode_numericentity -- HTML数値エンティティを文字にデコードする
mb_detect_encoding -- 文字エンコーディングを検出する
mb_detect_order -- 文字エンコーディング検出順序の設定/取得
mb_encode_mimeheader -- MIMEヘッダの文字列をエンコードする
mb_encode_numericentity -- 文字をHTML数値エンティティにエンコードする
mb_ereg_match -- マルチバイト文字列が正規表現に一致するか調べる
mb_ereg_replace -- マルチバイト文字列に正規表現による置換を行う
mb_ereg_search_getpos -- 次の正規表現検索を開始する位置を取得する
mb_ereg_search_getregs -- マルチバイト文字列が正規表現に一致する部分があるか調べる
mb_ereg_search_init -- マルチバイト正規表現検索用の文字列と正規表現を設定する
mb_ereg_search_pos -- 指定したマルチバイト文字列が正規表現に一致する部分の位置と長さを返 す
mb_ereg_search_regs -- 指定したマルチバイト文字列が正規表現に一致する部分を取得する
mb_ereg_search_setpos -- 次の正規表現検索を開始する位置を設定する
mb_ereg_search -- 指定したマルチバイト文字列が正規表現に一致するか調べる
mb_ereg -- マルチバイト文字列に正規表現マッチを行う
mb_eregi_replace -- マルチバイト文字列に大文字小文字を区別せずに正規表現による置換を行う
mb_eregi -- マルチバイト文字列に大文字小文字を区別しない正規表現マッチを行う
mb_get_info -- mbstringの内部設定値を取得する
mb_http_input -- HTTP入力文字エンコーディングの検出
mb_http_output -- HTTP出力文字エンコーディングの設定/取得
mb_internal_encoding -- 内部文字エンコーディングの設定/取得
mb_language -- カレントの言語を設定/取得
mb_output_handler -- 出力バッファ内で文字エンコーディングを変換するコールバック関数
mb_parse_str -- GET/POST/COOKIEデータをパースし、グローバル変数を設定する
mb_preferred_mime_name -- MIME文字設定を文字列で得る
mb_regex_encoding -- カレントの正規表現用のエンコーディングを文字列として返す
mb_regex_set_options -- マルチバイト正規表現関数のデフォルトオプションを取得または設定する
mb_send_mail -- エンコード変換を行ってメールを送信する
mb_split -- マルチバイト文字列を正規表現により分割する
mb_strcut -- 文字列の一部を得る
mb_strimwidth -- 指定した幅で文字列を丸める
mb_strlen -- 文字列の長さを得る
mb_strpos -- 文字列の中に指定した文字列が最初に現れる位置を見つける
mb_strrpos -- 文字列の中に指定した文字列が最後に現れる位置を見つける
mb_strtolower -- 文字列を小文字にする
mb_strtoupper -- 文字列を大文字にする
mb_strwidth -- 文字列の幅を返す
mb_substitute_character -- 置換文字の設定/入手
mb_substr_count -- 副文字列の出現関数を数える
mb_substr -- 文字列の一部を得る