ヘッダーをスキップ

Oracle Database 2日でPHP開発者ガイド
11gリリース1(11.1)

E05696-01
目次
目次
索引
索引

戻る 次へ

8 グローバル・アプリケーションの構築

この章では、PHPおよびOracle Database環境でのグローバル・アプリケーションの開発について説明します。 グローバルなインターネット・アプリケーションの開発およびデプロイに関連付けられている基本的なタスク(ロケール認識の開発、ユーザー選択言語でのHTMLコンテンツの構築、ユーザーのロケールの表記規則に従ったデータの表示など)について説明します。

様々なロケールがサポートされているグローバルなインターネット・アプリケーションを構築するには、優れた開発プラクティスが必要です。 ロケールとは、各国語およびその言語が話されている地域のことです。 アプリケーション自体がユーザーのロケール・プリファレンスを認識し、ユーザーが考えているとおりの表記規則に従ってコンテンツを表示できる必要があります。 適切なロケール特性(正しい日付書式や数値書式など)でデータを表示することが重要です。 Oracle Databaseは、完全な国際化を実現しており、グローバル・アプリケーションを開発およびデプロイするためのグローバルなプラットフォームを提供します。

この章の内容は次のとおりです。

OracleとPHP間の環境の確立

グローバル・アプリケーションを構築するための最初の手順は、PHPエンジンとOracleデータベースの間に接続を正しく設定する手順です。これで、すべての層にわたってデータ整合性が保証されます。 インターネット・ベースのほとんどの標準規格で、文字エンコーディングとしてUnicodeがサポートされているため、この章ではデータ交換用のキャラクタ・セットとしてUnicodeを使用します。

Zend Core for OracleはOracle OCIアプリケーションであり、OCIに適用されるルールはPHPにも適用されます。 Oracleロケールの動作(OCIアプリケーションで使用されるクライアント・キャラクタ・セットを含む)は、NLS_LANG環境変数で定義します。 この環境変数の形式は次のとおりです。

     <language>_<territory>.<character set>

たとえば、ドイツのドイツ語ユーザーがUnicodeでアプリケーションを実行している場合、NLS_LANGは次のように設定されています。

GERMAN_GERMANY.AL32UTF8

言語および地域の設定によって、Oracle日付書式、エラー・メッセージ言語、ソート順序に使用されるルールなどのOracleの動作が制御されます。 キャラクタ・セットAL32UTF8は、UTF-8のOracle名です。

NLS_LANG環境変数の詳細は、Oracle Databaseのインストレーション・ガイドを参照してください。

Zend Core for OracleがApacheにインストールされている場合は、/etc/profileNLS_LANGを設定できます。

    export NLS_LANG GERMAN_GERMANY.AL32UTF8

Zend Core for OracleがOracle HTTP Serverにインストールされている場合は、$ORACLE_HOME/opmn/conf/opmn.xmlに環境変数としてNLS_LANGを設定する必要があります

   <ias-component id="HTTP_Server">
     <process-type id="HTTP_Server" module-id="OHS">
       <environment>
         <variable id="PERL5LIB"
          value="D:\oracle\1012J2EE\Apache\Apache\mod_perl\site\5.6.1\lib"/>
         <variable id="PHPRC" value="D:\oracle\1012J2EE\Apache\Apache\conf"/>
         <variable id="NLS_LANG" value="german_germany.al32utf8"/>
       </environment>
       <module-data>
         <category id="start-parameters">
           <data id="start-mode" value="ssl-disabled"/>
         </category>
       </module-data>
       <process-set id="HTTP_Server" numprocs="1"/>
     </process-type>
   </ias-component>

この変更を実装するには、Webリスナーを再起動する必要があります。

文字列の操作

PHPは、ISO-8859-1キャラクタ・セットで動作するように設計されています。 それ以外のキャラクタ・セット(特にマルチバイト・キャラクタ・セット)を処理する場合は、一連のマルチバイト文字列関数を使用できます。 これらの関数を有効にするには、Zend Core for Oracleコンソールを開き、「Configuration」タブに移動します。

「Extensions」サブタブにナビゲートし、「Zend Core Extensions」ツリー・コントロールを開きます。

アプリケーション・コードでmb_strlen()などの関数を使用して、文字列内の文字数を計算する必要があります。 これによって、文字列内のバイト数を戻すstrlen()とは異なる値が戻される場合があります。

mbstring拡張モジュールを有効にし、Webサーバーを再起動すると、いくつかの構成オプションを使用できるようになります。 mbstring.func_overloadをOverload設定のいずれかに設定して、標準のPHP文字列関数の動作を変更できます。

詳細は、PHPのmbstringに関する次のリファレンス・マニュアルを参照してください。

http://www.php.net/mbstring

ユーザーのロケールの決定

グローバル環境のアプリケーションでは、ロケール・プリファレンスが異なるユーザーに対応する必要があります。 ユーザーの優先ロケールを決定した後は、そのロケールの言語でHTMLコンテンツを構築し、そのロケールの表記規則に従います。

ユーザーのロケールを決定する一般的な方法として、ブラウザのデフォルトのISOロケール設定を使用する方法があります。 通常、ブラウザは、Accept Language HTTPヘッダーでHTTPサーバーにそのロケール・プリファレンス設定を送信します。 Accept Language HTTPヘッダーがNULLの場合は、使用可能なロケール・プリファレンス情報がなく、事前定義のデフォルトのロケールにフォールバックされます。

次のPHPコードは、$_SERVERサーバー変数を使用して、Accept Language HTTPヘッダーからISOロケールを取り出します。

$s = $_SERVER["HTTP_ACCEPT_LANGUAGE"]

ロケール認識の開発

ユーザーのロケール・プリファレンスを決定すると、日付、時間、通貨の書式などのロケール依存の関数をコールして、ロケールの表記規則に従ってHTMLページを書式設定できます。

様々なプログラミング環境で実装されるグローバル・アプリケーションを構築する場合は、異なる環境間でユーザー・ロケール設定を同期できるようにする必要があります。 たとえば、PL/SQLプロシージャをコールするPHPアプリケーションでは、PL/SQLプロシージャをコールする前に、ISOロケールを対応するNLS_LANGUAGE値およびNLS_TERRITORY値にマップし、ユーザーのロケールに合わせてパラメータ値を変更する必要があります。 PL/SQL UTL_I18Nパッケージには、ISOロケールとOracleロケール間でマップできるマッピング関数が含まれています。

表8-1に、よく使用されるロケールをISO環境およびOracle環境に定義する方法を示します。

表8-1    ISO、SQL、PL/SQLの各プログラミング環境でのロケールの表現 
ロケール  ロケールID  NLS_LANGUAGE  NLS_TERRITORY 

中国語(中華人民共和国) 

zh-CN 

SIMPLIFIED CHINESE 

CHINA 

中国語(台湾) 

zh-TW 

TRADITIONAL CHINESE 

TAIWAN 

英語(アメリカ合衆国) 

en-US 

AMERICAN 

AMERICA 

英語(イギリス) 

en-GB 

ENGLISH 

UNITED KINGDOM 

フランス語(カナダ) 

fr-CA 

CANADIAN FRENCH 

CANADA 

フランス語(フランス) 

fr-FR 

FRENCH 

FRANCE 

ドイツ語 

de 

GERMAN 

GERMANY 

イタリア語 

it 

ITALIAN 

ITALY 

日本語 

ja 

JAPANESE 

JAPAN 

韓国語 

ko 

KOREAN 

KOREA 

ポルトガル語(ブラジル) 

pt-BR 

BRAZILIAN PORTUGUESE 

BRAZIL 

ポルトガル語 

pt 

PORTUGUESE 

PORTUGAL 

スペイン語 

es 

SPANISH 

SPAIN 

HTMLページのエンコーディング

HTMLページのエンコーディングは、ブラウザおよびインターネット・アプリケーションに関する重要な情報です。 ページ・エンコーディングは、インターネット・アプリケーションがサービスを提供しているロケールで使用されるキャラクタ・セットとみなすことができます。 ブラウザは、正しいフォントおよびキャラクタ・セットのマッピング表を使用してHTMLページを表示できるように、ページ・エンコーディングを認識している必要があります。 インターネット・アプリケーションは、HTMLフォームに入力されたデータを処理できるように、HTMLページ・エンコーディングを認識している必要があります。

ロケールごとに異なるネイティブ・エンコーディングを使用するのではなく、すべてのページ・エンコードでUTF-8(Unicodeエンコーディング)を使用することをお薦めします。 このエンコーディングを使用すると、グローバル・アプリケーションのコーディングを簡略化できるのみでなく、単一ページに多言語コンテンツを配置できます。

HTMLページ用のページ・エンコーディングの指定

HTMLページのエンコーディングをHTTPヘッダーまたはHTMLページ・ヘッダーに指定できます。

HTTPヘッダーへのエンコーディングの指定

HTMLページ・エンコーディングをHTTPヘッダーに指定するには、HTTP仕様にContent-Type HTTPヘッダーを含めます。 このヘッダーで、コンテンツ・タイプおよびキャラクタ・セットを指定します。 Content-Type HTTPヘッダーの形式は次のとおりです。

Content-Type: text/html; charset=utf-8

charsetパラメータで、HTMLページのエンコーディングを指定します。 charsetパラメータに指定可能な値は、ブラウザでサポートされている文字エンコーディングのIANA名です。

HTMLページ・ヘッダーへのエンコーディングの指定

この方法は、主に静的なHTMLページに使用します。 HTMLページ・エンコーディングをHTMLページ・ヘッダーに指定するには、文字エンコーディングを次のようにHTMLヘッダーに指定します。

<meta http-equiv="Content-Type" content="text/html;charset=utf-8">

charsetパラメータで、HTMLページのエンコーディングを指定します。 Content-Type HTTPの場合と同様に、charsetパラメータに指定可能な値は、ブラウザでサポートされている文字エンコーディングのIANA名です。

PHPへのページ・エンコーディングの指定

default_charset構成変数を次のように設定して、Content-Type HTTPヘッダーのHTMLページのエンコーディングをPHPに指定できます。

default_charset = UTF-8

これは、Zend Core for Oracleコンソールの「Configuration」タブにあります。 「PHP」サブタブを選択し、「Data Handling」ツリー・コントロールを開きます。 値を入力した後、構成設定を保存し、Webサーバーを再起動します。

この設定によって送信ページは変換されません。 アプリケーションでは、サーバー生成のページをUTF-8でエンコードする必要があります。

翻訳のためのHTMLページのコンテンツの編成

ユーザー・インタフェースをユーザーのローカル言語で使用できるようにすることは、アプリケーションのグローバル化の基本的なタスクです。 HTMLページのコンテンツの翻訳可能なソースは、次のように分類されます。

PHPの文字列

PHPアプリケーション・ロジック内の翻訳可能な文字列を外部化して、そのテキストを簡単に翻訳できるようにする必要があります。 これらのテキスト・メッセージは、翻訳対象データのタイプおよびボリュームに応じて、フラット・ファイルまたはデータベース表に格納できます。

静的ファイル

HTMLファイルやGIFファイルなどの静的ファイルは簡単に翻訳できます。 これらのファイルを翻訳する場合は、UTF-8をファイル・エンコーディングとして指定して、対応する言語に翻訳する必要があります。 翻訳したファイルの言語を区別するには、静的ファイルを言語ごとに異なるディレクトリにステージングするか、または異なるファイル名でステージングします。

データベースのデータ

通常、製品名や製品説明などの動的な情報がデータベースに格納されています。 様々な翻訳を区別するには、この情報を保持しているデータベース・スキーマに言語を示すための列を含める必要があります。 目的の言語を選択するには、問合せにWHERE句を含める必要があります。

ユーザーが考えているとおりの表記規則を使用したデータの表示

アプリケーションのデータは、ユーザーが考えているとおりに表示される必要があります。 そうでない場合、データの意味が誤って解釈される可能性があります。 たとえば、12/11/05という日付は、アメリカ合衆国では2005年12月11日を意味するのに対して、イギリスでは2005年11月12日を意味します。 ユーザーの数値書式および通貨書式にも同様の違いが存在します。 たとえば、.という記号はアメリカ合衆国では小数点セパレータですが、ドイツでは千単位セパレータです。

各言語に独自のソート・ルールがあります。 アルファベットの文字の順序に従う言語、文字の画数に従う言語、単語の発音に従う言語などがあります。 ユーザーが慣れている言語順序でソートされていないデータを表示すると、情報の検索が難しくなり、時間がかかることがあります。

アプリケーション・ロジックおよびデータベースから取り出すデータの量によっては、アプリケーション・レベルではなくデータベース・レベルでデータを書式設定した方がより適切な場合があります。 Oracle Databaseには、ユーザーのロケール・プリファレンスがわかっている場合にデータの表示を調整するのに役立つ機能が多く用意されています。 以降の項では、SQLでのロケール依存の操作の例を示します。

Oracleの日付書式

Oracle Databaseの日付表示書式には、標準の日付、短い日付、長い日付の3種類があります。 次の例では、アメリカ合衆国およびドイツでの短い日付書式と長い日付書式の違いを示します。

SQL> alter session set nls_territory=america nls_language=american;

Session altered.


SQL> select employee_id EmpID,
  2  substr(first_name,1,1)||'.'||last_name "EmpName",
  3  to_char(hire_date,'DS') "Hiredate",
  4  to_char(hire_date,'DL') "Long HireDate"
  5  from employees
  6* where employee_id <105;

     EMPID EmpName                     Hiredate   Long HireDate
---------- --------------------------- ---------- -----------------------------
       100 S.King                      06/17/1987 Wednesday, June 17, 1987
       101 N.Kochhar                   09/21/1989 Thursday, September 21, 1989
       102 L.De Haan                   01/13/1993 Wednesday, January 13, 1993
       103 A.Hunold                    01/03/1990 Wednesday, January 3, 1990
       104 B.Ernst                     05/21/1991 Tuesday, May 21, 1991

SQL> alter session set nls_territory=germany nls_language=german;

Session altered.

SQL> select employee_id EmpID,
  2  substr(first_name,1,1)||'.'||last_name "EmpName",
  3  to_char(hire_date,'DS') "Hiredate",
  4  to_char(hire_date,'DL') "Long HireDate"
  5  from employees
  6* where employee_id <105;

     EMPID EmpName                     Hiredate Long HireDate
---------- --------------------------- -------- ------------------------------
       100 S.King                      17.06.87 Mittwoch, 17. Juni 1987
       101 N.Kochhar                   21.09.89 Donnerstag, 21. September 1989
       102 L.De Haan                   13.01.93 Mittwoch, 13. Januar 1993
       103 A.Hunold                    03.01.90 Mittwoch, 3. Januar 1990
       104 B.Ernst                     21.05.91 Dienstag, 21. Mai 1991

Oracleの数値書式

次の例では、アメリカ合衆国とドイツでの小数点文字およびグループ・セパレータの違いを示します。

SQL> alter session set nls_territory=america;

Session altered.

SQL> select employee_id EmpID,
  2  substr(first_name,1,1)||'.'||last_name "EmpName",
  3  to_char(salary, '99G999D99') "Salary"
  4  from employees
  5* where employee_id <105

     EMPID EmpName                     Salary
---------- --------------------------- ----------
       100 S.King                       24,000.00
       101 N.Kochhar                    17,000.00
       102 L.De Haan                    17,000.00
       103 A.Hunold                      9,000.00
       104 B.Ernst                       6,000.00

SQL> alter session set nls_territory=germany;

Session altered.

SQL> select employee_id EmpID,
  2  substr(first_name,1,1)||'.'||last_name "EmpName",
  3  to_char(salary, '99G999D99') "Salary"
  4  from employees
  5* where employee_id <105

     EMPID EmpName                     Salary
---------- --------------------------- ----------
       100 S.King                       24.000,00
       101 N.Kochhar                    17.000,00
       102 L.De Haan                    17.000,00
       103 A.Hunold                      9.000,00
       104 B.Ernst                       6.000,00

Oracleの言語ソート

スペイン語では、伝統的にchllおよびÒが一意の文字として扱われ、それぞれclおよびnの後に順序付けられます。 次の例では、ChenとChungという従業員名にスペイン語のソートを使用した場合の結果を示します。

SQL> alter session set nls_sort=binary;

Session altered.

SQL> select employee_id EmpID,
  2         last_name "Last Name"
  3  from employees
  4  where last_name like 'C%'
  5* order by last_name

     EMPID Last Name
---------- -------------------------
       187 Cabrio
       148 Cambrault
       154 Cambrault
       110 Chen
       188 Chung
       119 Colmenares

6 rows selected.

SQL> alter session set nls_sort=spanish_m;

Session altered.

SQL> select employee_id EmpID,
  2         last_name "Last Name"
  3  from employees
  4  where last_name like 'C%'
  5* order by last_name

     EMPID Last Name
---------- -------------------------
       187 Cabrio
       148 Cambrault
       154 Cambrault
       119 Colmenares
       110 Chen
       188 Chung

6 rows selected.

Oracleのエラー・メッセージ

NLS_LANGUAGEパラメータは、データベースから戻されるデータベース・エラー・メッセージの言語も制御します。 SQL文を発行する前にこのパラメータを設定すると、言語固有のデータベース・エラー・メッセージがアプリケーションに戻されるようになります。

次のサーバー・メッセージについて考えてみます。

ORA-00942: table or view does not exist

NLS_LANGUAGEパラメータをフランス語に設定すると、このサーバー・メッセージは次のように表示されます。

ORA-00942: table ou vue inexistante

Oracle Databaseのグローバリゼーション・サポート機能の詳細は、『Oracle Database 2日で開発者ガイド』のグローバル環境での作業に関する項を参照してください。


戻る 次へ
Oracle
Copyright © 2007 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引