1
0
mirror of https://github.com/php/doc-ja.git synced 2026-03-30 02:52:08 +02:00
Files
archived-doc-ja/reference/mbstring/reference.xml
TAKAGI Masahiro fa482f421c sync with en.
git-svn-id: https://svn.php.net/repository/phpdoc/ja/trunk@195169 c90b9560-bf6c-de11-be94-00142212c4b1
2005-09-05 11:34:14 +00:00

561 lines
23 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision: 1.10 $ -->
<!-- EN-Revision: 1.22 Maintainer: hirokawa Status: ready -->
<!-- Purpose: international -->
<!-- Membership: bundled -->
<reference id="ref.mbstring">
<title>マルチバイト文字列関数(mbstring)</title>
<titleabbrev>マルチバイト文字列</titleabbrev>
<partintro>
<section id="mbstring.intro">
&reftitle.intro;
<para>
全ての文字をシングルバイトで一対一表現可能な言語は数多くありますが、
文字表現に単一バイトによる表現範囲を越えるほど多くの文字を必要とする
言語も多くあります。マルチバイト文字のエンコーディング法は、
こうした(256を越える)多くの文字を通常のビット単位の符号化システムで表現するために
開発されました。
</para>
<para>
マルチバイトエンコーディングで符号化された文字列を(trim, split, splice,などで)
処理する際、こうしたエンコーディングでは二つ以上の連続するバイトが一つの文字を表す
可能性があるため、特別な関数を使用する必要があります。
マルチバイトに対応しない文字列関数を文字列に適用した場合、マルチバイト文字の
先頭バイトまたは終了バイトを検出できずに文字列を壊し、多くの場合には元の意味を
失わせてしまう可能性があります。
</para>
<para>
<literal>mbstring</literal>は、これらのマルチバイト対応関数を
提供し、マルチバイトエンコーディング、シングルバイトエンコーディングの処理を
基本的に前提とするPHPで処理することを容易にします。
これに加えて、<literal>mbstring</literal> は、複数のエンコーディング間での
文字エンコーディング変換を行います。
</para>
<para>
<literal>mbstring</literal>は、もともと日本語のWebページで使用する
ために開発されましたが、UTF-8やUCS-2のようなUnicodeに基づく
エンコーディングや多くの(以下に示す)シングルバイトエンコーディングも処理する
ことが可能です。
</para>
<section id="mbstring.php4.req">
<title>PHPの文字エンコーディングに関する要件</title>
<para>
以下の型のエンコーディングが、PHPで安全に使用することができます。
<itemizedlist>
<listitem>
<para>
シングルバイトエンコーディングで、
<itemizedlist>
<listitem>
<simpara>
<literal>00h</literal>から <literal>7fh</literal>の範囲の文字に関して、
ASCII互換(ISO646互換)のマッピングを有する。
</simpara>
</listitem>
</itemizedlist>
</para>
</listitem>
<listitem>
<para>
マルチバイトエンコーディングで、
<itemizedlist>
<listitem>
<simpara>
<literal>00h</literal>から <literal>7fh</literal>の範囲の文字では、
ASCII互換のマッピングを有する。
</simpara>
</listitem>
<listitem>
<simpara>
ISO2022エスケープシーケンスを使用しない。
</simpara>
</listitem>
<listitem>
<simpara>
単一の文字を表す複数バイトのいずれにおいても
<literal>00h</literal>から<literal>7fh</literal>
値を使用しない。
</simpara>
</listitem>
</itemizedlist>
</para>
</listitem>
</itemizedlist>
</para>
<para>
PHPで動作しないと思われる文字エンコーディングの例を以下に示します。
<informalexample>
<programlisting>
<![CDATA[
JIS, SJIS, ISO-2022-JP, BIG-5
]]>
</programlisting>
</informalexample>
</para>
<para>
これらのエンコーディングで書かれたPHPスクリプトは、
特に符号化された文字列がスクリプトで記述子やリテラルに使用される場合には、
動作しない可能性がありますが、入力されるHTTPクエリに関して
<literal>mbstring</literal>の透過的なエンコーディングフィルタを
設定することでこれらのエンコーディングをほとんど使用しないようにすることが
できます。
</para>
<note>
<para>
SJIS, BIG5, CP936, CP949, GB18030 は、読者がパーサ/コンパイラ、
文字エンコーディングと文字エンコーディングの問題点について精通していない限り
内部エンコーディングとして使用するべきではありません。
</para>
</note>
<note>
<para>
PHPでデータベースを使用する場合、性能を向上させるためにデータベースとPHPの
内部エンコーディングについて同じ文字エンコーディングを使用することを推奨します。
</para>
<para>
PostgreSQLを使用している場合、バックエンドの文字エンコーディング
と異なる文字エンコーディングを使用することが可能です。詳細につい
ては、PostgreSQLのマニュアルを参照ください。
</para>
</note>
</section>
</section>
&reference.mbstring.configure;
&reference.mbstring.ini;
<section id="mbstring.resources">
&reftitle.resources;
&no.resource;
</section>
&reference.mbstring.constants;
<section id="mbstring.http">
<title>HTTP入出力</title>
<para>
HTTP 入出力の文字エンコーディング変換はバイナリデータも変換して
しまいます。HTTP入出力にバイナリデータが使用される場合、ユーザは、
文字エンコーディング変換を制御する必要があります。
</para>
<note>
<para>
PHP 4.3.2およびそれ以前のバージョンの場合、
HTMLフォームの<literal>enctype</literal>
<literal>multipart/form-data</literal>に設定された場合、
<literal>mbstring</literal> は、POSTデータの文字エンコーディング
を変換しません。この場合、文字列を内部文字エンコーディングに変換
してやる必要があります。
</para>
</note>
<note>
<para>
PHP 4.3.3以降、HTMLフォームの<literal>enctype</literal>
<literal>multipart/form-data</literal>に設定され、かつ、
&php.ini;において
<literal>mbstring.encoding_translation</literal>にOnが指定されて
いる場合、
POSTデータの変数とアップロードされたファイルの名前の
文字エンコーディングは、内部文字エンコーディングに変換されます。
ただし、クエリキーに関しては、変換されません。
</para>
</note>
<para>
<itemizedlist>
<listitem>
<simpara>
HTTP入力
</simpara>
<para>
PHPスクリプトでHTTP入力文字変換を制御する手段はありません。
HTTP入力文字変換を無効にするには、&php.ini;
で行う必要があります。
<example>
<title>&php.ini;でHTTP入力変換を無効にする</title>
<programlisting role="php">
<![CDATA[
;; HTTP入力変換を無効にする
mbstring.http_input = pass
;; HTTP入力変換を無効にする (PHP 4.3.0以降)
mbstring.encoding_translation = Off
]]>
</programlisting>
</example>
</para>
<para>
PHPをApacheモジュールで使用する場合、PHP iniの設定を
&httpd.conf; により仮想ホスト単位で、または
&htaccess; によりディレクトリ単位で上書きすることが可能です。
詳細は、<link linkend="configuration">設定</link>の節および
Apacheマニュアルを参照ください。
</para>
</listitem>
<listitem>
<simpara>
HTTP出力
</simpara>
<para>
出力の文字エンコーディング変換を有効にする方法は複数あります。
一つ目は &php.ini;、もう1つは
<function>ob_start</function><literal>ob_start</literal>
のコールバック関数として
<function>mb_output_handler</function> を指定するものです。
</para>
<note>
<para>
PHP3-i18nのユーザにとっては、<literal>mbstring</literal>の出
力変換は、PHP3-i18nとは異なっています。文字エンコーディング
は、出力のバッファリング機能を使用して変換されます。
</para>
</note>
</listitem>
</itemizedlist>
</para>
<para>
<example>
<title>&php.ini; の設定例</title>
<programlisting>
<![CDATA[
;; 全てのPHPページで出力の文字エンコーディング変換を有効にする
;; 出力バッファリングを有効にする
output_buffering = On
;; mb_output_handlerによる出力変換を有効にする
output_handler = mb_output_handler
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>スクリプトの例</title>
<programlisting role="php">
<![CDATA[
<?php
// このページでのみ出力の文字エンコーディング変換を有効にする
// HTTP 出力文字エンコーディングをSJISに設定する
mb_http_output('SJIS');
// 出力のバッファリングを開始し、コールバック関数として"mb_output_handler"
// を指定する
ob_start('mb_output_handler');
?>
]]>
</programlisting>
</example>
</para>
</section>
<section id="mbstring.supported-encodings">
<title>サポートされる文字エンコーディング</title>
<simpara>
現在、以下の文字エンコーディングが<literal>mbstring</literal>
ジュールによりサポートされています。文字エンコーディングは、
<literal>mbstring</literal>関数の<literal>encoding</literal>パラ
メータで指定することが可能です。
</simpara>
<para>
以下の文字エンコーディングがこのPHPエクステンションでサポートされ
ています。
</para>
<itemizedlist>
<listitem><simpara>UCS-4</simpara></listitem>
<listitem><simpara>UCS-4BE</simpara></listitem>
<listitem><simpara>UCS-4LE</simpara></listitem>
<listitem><simpara>UCS-2</simpara></listitem>
<listitem><simpara>UCS-2BE</simpara></listitem>
<listitem><simpara>UCS-2LE</simpara></listitem>
<listitem><simpara>UTF-32</simpara></listitem>
<listitem><simpara>UTF-32BE</simpara></listitem>
<listitem><simpara>UTF-32LE</simpara></listitem>
<listitem><simpara>UTF-16</simpara></listitem>
<listitem><simpara>UTF-16BE</simpara></listitem>
<listitem><simpara>UTF-16LE</simpara></listitem>
<listitem><simpara>UTF-7</simpara></listitem>
<listitem><simpara>UTF7-IMAP</simpara></listitem>
<listitem><simpara>UTF-8</simpara></listitem>
<listitem><simpara>ASCII</simpara></listitem>
<listitem><simpara>EUC-JP</simpara></listitem>
<listitem><simpara>SJIS</simpara></listitem>
<listitem><simpara>eucJP-win</simpara></listitem>
<listitem><simpara>SJIS-win</simpara></listitem>
<listitem><simpara>ISO-2022-JP</simpara></listitem>
<listitem><simpara>JIS</simpara></listitem>
<listitem><simpara>ISO-8859-1</simpara></listitem>
<listitem><simpara>ISO-8859-2</simpara></listitem>
<listitem><simpara>ISO-8859-3</simpara></listitem>
<listitem><simpara>ISO-8859-4</simpara></listitem>
<listitem><simpara>ISO-8859-5</simpara></listitem>
<listitem><simpara>ISO-8859-6</simpara></listitem>
<listitem><simpara>ISO-8859-7</simpara></listitem>
<listitem><simpara>ISO-8859-8</simpara></listitem>
<listitem><simpara>ISO-8859-9</simpara></listitem>
<listitem><simpara>ISO-8859-10</simpara></listitem>
<listitem><simpara>ISO-8859-13</simpara></listitem>
<listitem><simpara>ISO-8859-14</simpara></listitem>
<listitem><simpara>ISO-8859-15</simpara></listitem>
<listitem><simpara>byte2be</simpara></listitem>
<listitem><simpara>byte2le</simpara></listitem>
<listitem><simpara>byte4be</simpara></listitem>
<listitem><simpara>byte4le</simpara></listitem>
<listitem><simpara>BASE64</simpara></listitem>
<listitem><simpara>HTML-ENTITIES</simpara></listitem>
<listitem><simpara>7bit</simpara></listitem>
<listitem><simpara>8bit</simpara></listitem>
<listitem><simpara>EUC-CN</simpara></listitem>
<listitem><simpara>CP936</simpara></listitem>
<listitem><simpara>HZ</simpara></listitem>
<listitem><simpara>EUC-TW</simpara></listitem>
<listitem><simpara>CP950</simpara></listitem>
<listitem><simpara>BIG-5</simpara></listitem>
<listitem><simpara>EUC-KR</simpara></listitem>
<listitem><simpara>UHC (CP949)</simpara></listitem>
<listitem><simpara>ISO-2022-KR</simpara></listitem>
<listitem><simpara>Windows-1251 (CP1251)</simpara></listitem>
<listitem><simpara>Windows-1252 (CP1252)</simpara></listitem>
<listitem><simpara>CP866 (IBM866)</simpara></listitem>
<listitem><simpara>KOI8-R</simpara></listitem>
</itemizedlist>
<para>
&php.ini;のエントリではエンコーディング名を指定可能ですが、
&quot;<literal>auto</literal>&quot; および
&quot;<literal>pass</literal>&quot; も指定可能です。
<literal>mbstring</literal> 関数には、エンコーディング名と
&quot;<literal>auto</literal>&quot; を指定可能です。
</para>
<para>
&quot;<literal>pass</literal>&quot; が指定された場合、文字エンコー
ディング変換は行われません。
</para>
<para>
&quot;<literal>auto</literal>&quot; が指定された場合、この文字列
は、&quot;<literal>ASCII,JIS,UTF-8,EUC-JP,SJIS</literal>&quot;
変換されます。
</para>
<para>
<function>mb_detect_order</function>も参照ください。
</para>
</section>
<section id="mbstring.overload">
<title>マルチバイト対応版関数による既存関数のオーバーロード</title>
<para>
PHPアプリケーションの多くは、英語等のシングルバイトの言語用に設計
されており、日本語を含むマルチバイト文字列を扱う場合には問題を生
じる場合があります。<function>substr</function>等のPHPの文字列関
数の多くはマルチバイト文字列に対応していません。
</para>
<para>
マルチバイト拡張モジュール(mbstring)では、文字列を処理するPHP関数
のマルチバイト対応版(例えば、<function>substr</function>の場合は
<function>mb_substr</function>)をサポートしています。
</para>
<para>
マルチバイト拡張モジュール(mbstring)では、PHP 4.2.0以降で既存の
PHP関数を対応するマルチバイト文字対応版の関数でオーバーロードする
機能をサポートします。関数のオーバーロードを行うと、例えば
<function>substr</function>をPHPスクリプトでコールした場合に、
<function>mb_substr</function>が代わりにコールされるようになりま
す。これにより、マルチバイト文字に対応しないアプリケーションの移
植が容易となります。
</para>
<para>
関数オーバーロードを使用するには、設定ファイル php.iniの
<literal>mbstring.func_overload</literal>ディレクティブに0以外の
値を設定します。設定値によりオーバーロードされる関数の種類が異な
ります。メール関数の場合は1、文字列関数は2、正規表現関数は4を使用
します。論理和をとることにより複数の値を指定可能です。例えば、7を
指定すると全てのメール、文字列、正規表現関数をオーバーロードしま
す。オーバーロードされる関数を下表に示します。
<table>
<title>オーバーロードされる関数</title>
<tgroup cols="3">
<thead>
<row>
<entry>mbstring.func_overloadの値</entry>
<entry>元の関数</entry>
<entry>オーバーロードする関数</entry>
</row>
</thead>
<tbody>
<row>
<entry>1</entry>
<entry><function>mail</function></entry>
<entry><function>mb_send_mail</function></entry>
</row>
<row>
<entry>2</entry>
<entry><function>strlen</function></entry>
<entry><function>mb_strlen</function></entry>
</row>
<row>
<entry>2</entry>
<entry><function>strpos</function></entry>
<entry><function>mb_strpos</function></entry>
</row>
<row>
<entry>2</entry>
<entry><function>strrpos</function></entry>
<entry><function>mb_strrpos</function></entry>
</row>
<row>
<entry>2</entry>
<entry><function>substr</function></entry>
<entry><function>mb_substr</function></entry>
</row>
<row>
<entry>4</entry>
<entry><function>ereg</function></entry>
<entry><function>mb_ereg</function></entry>
</row>
<row>
<entry>4</entry>
<entry><function>eregi</function></entry>
<entry><function>mb_eregi</function></entry>
</row>
<row>
<entry>4</entry>
<entry><function>ereg_replace</function></entry>
<entry><function>mb_ereg_replace</function></entry>
</row>
<row>
<entry>4</entry>
<entry><function>eregi_replace</function></entry>
<entry><function>mb_eregi_replace</function></entry>
</row>
<row>
<entry>4</entry>
<entry><function>split</function></entry>
<entry><function>mb_split</function></entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<note>
<para>
ディレクトリ単位の設定でこの関数オーバーロディングオプションを使用することは
推奨されません。これは、実用的な環境ではまだ安定性が確認されておらず、予期しない
結果をもたらす可能性があるためです。
</para>
</note>
</section>
<section id="mbstring.ja-basic">
<title>日本語のマルチバイト文字に関する基本事項</title>
<para>
多くの日本語の文字は1文字あたり複数のバイトを必要とします。加え
て、日本語の環境では複数の文字エンコーディング手法が使用されてい
ます。使用されているのは、EUC-JP、Shift_JIS(SJIS)、
ISO-2022-JP(JIS) 文字エンコーディングです。Unicodeが普及しつつあ
り、UTF-8 も使用されています。日本語環境のWebアプリケーションを
開発するためには、HTTP入出力、RDBMS、e-mailの処理においてそれぞ
れに適した文字集合を使用することが重要となります。
</para>
<para>
<itemizedlist>
<listitem>
<simpara>
1文字は最大6バイトになる
</simpara>
</listitem>
<listitem>
<simpara>
マルチバイト文字は通常シングルバイト文字の2倍の幅となります。
広い幅の文字は「全角」、狭い幅の文字は「半角」と呼ばれます。
通常、「全角」文字は固定幅です。
</simpara>
</listitem>
<listitem>
<simpara>
いくつかの文字エンコーディングでは、ISO2022で定義された
マルチバイト文字列を開始/終了するためのシフト(エスケープ)シーケンスを
使用しています。
</simpara>
</listitem>
<listitem>
<simpara>
SMTP/NNTPでは、ISO-2022-JP を使用する必要があり、ヘッダとエンティティは
各RFCの規定に基づき再度符号化される必要があります。
これらは必須のものではありませんが、多くの一般的なユーザーエージェントは、
他の符号化手法を認識できないため、行っておく方が良いでしょう。
</simpara>
</listitem>
<listitem>
<simpara>
<ulink url="&url.imode;">i-mode</ulink>,
<ulink url="&url.vlife;">Vodafone live!</ulink>, または
<ulink url="&url.ezweb;">EZweb</ulink>のような
携帯電話サービス用に作成されたWebページは、Shift_JISを使用する
ことになります。
</simpara>
</listitem>
</itemizedlist>
</para>
</section>
<section id="mbstring.ref">
<title>リファレンス</title>
<para>
マルチバイト文字エンコーディングと関連する問題は非常に複雑です。
ここで詳細について記述することは不可能です。詳細な事項については、
以下のURLおよび他のリソースを参照ください。
<itemizedlist>
<listitem>
<para>
Unicode/UTF/UCS/等
</para>
<para>
<ulink url="&url.unicode;">&url.unicode;</ulink>
</para>
</listitem>
<listitem>
<para>
日本語/韓国語/中国語文字に関する情報
</para>
<para>
<literal>
<ulink url="&url.oreilly.cjk-inf;">&url.oreilly.cjk-inf;</ulink>
</literal>
</para>
</listitem>
</itemizedlist>
</para>
</section>
&reference.mbstring.encodings;
</partintro>
&reference.mbstring.functions;
</reference>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->