|
|
LVIII. マルチバイト文字列関数(mbstring)
全ての文字をシングルバイトで表現可能な言語は数多くあります。マル
チバイト文字コードは、多くの言語で文字を表すために使用されていま
す。mbstring は日本語文字を処理するために開発
されました。しかし、mbstring 関数の多くは、日
本語以外の文字エンコーディングも処理することが可能です。
マルチバイト文字エンコーディングは、バイトの並びで単一の文字を表
現します。いくつかの文字エンコーディングでは、マルチバイト文字列
の始まり/終わりを表すためにシフト(エスケープ)シーケンスが使用され
ています。この場合、マルチバイト文字エンコーディングに対応した方
法でない限り、分割または追加されるとマルチバイト文字列は壊れてし
まう可能性があります。このモジュールは、マルチバイト文字列に対応
した文字列関数および変換関数のようなその他のユーティリティ関数を
提供します。
PHPは、基本的にISO-8859-1用に設計されているため、いくつかのマルチ
バイト文字エンコーディングは、PHPで正常に動作しません。このため、
mbstring.language に適切な言語(日本語の場合は
Japanese)、mbstring.internal_encoding にPHPで動
作する文字エンコーディングを設定することが必要です。
PHP4の文字エンコーディングに関する規約
PHPの内部エンコーディングとして使用可能な文字エンコーディングと
使用できない文字エンコーディングの例を以下に示します。
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の設定により変化します。
表 1. Multi-Byte String 設定オプション 名前 | デフォルト | 変更可能な範囲 |
---|
mbstring.language | neutral | PHP_INI_ALL | mbstring.detect_order | NULL | PHP_INI_ALL | mbstring.http_input | pass | PHP_INI_ALL | mbstring.http_output | pass | 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.internal_encoding
のデフォルト値を定義し、php.iniにおいて
mbstring.internal_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 = neutral; デフォルト言語を中立(UTF-8)に設定 (デフォルト)
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内部にコンパイルされているか実行時に動的にロー
ドされるかのどちらかの場合のみ使用可能です。
HTTP 入出力の文字エンコーディング変換はバイナリデータも変換して
しまいます。HTTP入出力にバイナリデータが使用される場合、ユーザは、
文字エンコーディング変換を制御する必要があります。
注意:
PHP 4.3.3よりも前のバージョンの場合、
HTMLフォームのenctypeが
multipart/form-dataに設定された場合、
mbstring は、POSTデータの文字エンコーディング
を変換しません。この場合、文字列を内部文字エンコーディングに変換
してやる必要があります。
注意:
PHP 4.3.3以降、HTMLフォームのenctypeが
multipart/form-dataに設定され、かつ、
php.iniにおいて
mbstring.encoding_translationにOnが指定されて
いる場合、
POSTデータの変数とアップロードされたファイルの名前の
文字エンコーディングは、内部文字エンコーディングに変換されます。
ただし、HTMLフォームのnameに指定した文字は変換されません。
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
mb_http_output('SJIS');
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および他のリソースを参照下さい。
add a note
User Contributed Notes
マルチバイト文字列関数(mbstring)
Eugene Murai
24-Feb-2005 06:20
PHP can input and output Unicode, but a little different from what Microsoft means: when Microsoft says "Unicode", it unexplicitly means little-endian UTF-16 with BOM(FF FE = chr(255).chr(254)), whereas PHP's "UTF-16" means big-endian with BOM. For this reason, PHP does not seem to be able to output Unicode CSV file for Microsoft Excel. Solving this problem is quite simple: just put BOM infront of UTF-16LE string.
Example:
$unicode_str_for_Excel = chr(255).chr(254).mb_convert_encoding( $utf8_str, 'UTF-16LE', 'UTF-8');
Geoffrey
01-Feb-2005 08:59
For Windows users php_mbstring can be added as follows:-
if you have dowloaded the "short" version of PHP,
(php-4.3.10-installer.exe), download the full version .
(php-4.3.10-Win32.zip)
unzip it, find php_mbstring.dll in
f:\php-4.3.10-Win32\extensions, and copy it across to your
php\extensions directory
use Notepad to open your PHP.INI
change the extension_dir line to read
extension_dir = "e:\php\extensions\" (or whatever your
directory is called)
remove the semi-colon on line
; extension=php_mbstring.dll
save PHP.INI, restart PHP
| |