PHP国際化プログラミング
マルチバイト、ロケール、書式、タイムゾーン

以下はPHPの国際化の一般的なポイントとなります。
  1. マルチバイト文字

    日本語のようなマルチバイト文字を扱うためには、mbstringモジュールをWebサーバーにインストールする必要があります。
    mb_***()関数はマルチバイト文字の操作を提供し、いくつかのmb_を持たない関数は正しくマルチバイト文字を処理できないため、mb_***()関数に置き換える必要があります。

    主な重要関数は以下となります。

    === 主なマルチバイト関数の変換 === (非推称 -> 推称)
    
    mail() -> mb_send_mail()
    
    strlen() -> mb_strlen()
    strpos() -> mb_strpos()
    strrpos() -> mb_strrpos()
    substr() -> mb_substr()
    str_replace() -> mb_ereg_replace()
    strstr() -> mb_strstr()
    strtolower() -> mb_strtolower()
    strtoupper() -> mb_strtoupper() 
    
    ereg() -> mb_ereg() または preg_match()
    eregi() -> mb_eregi() または 'i'を使った preg_match()
    ereg_replace() -> mb_ereg_replace() または preg_replace()
    eregi_replace() -> mb_eregi_replace() または 'i'を使った preg_replace()
    split() -> mb_split() または preg_split()
    
    全てのマルチバイト関数については、
    PHPマニュアル - マルチバイト文字列 関数を参照してください。
    
    全ての非推称の関数については、
    PHPマニュアル - PHP 5.3.x で推奨されない機能を参照してください。
    
    
    * mbstring.func_overloadビットフラグを使うことで、非推称の関数のいくつかをオーバーロードされたマルチバイト関数として使用できます。
    PHPマニュアル - 関数のオーバーロード機能を参照してください。

  2. ユーザーロケールの設定

    ユーザーロケール(ユーザーの言語と地域)を日付操作や文化依存の書式(日付、通貨...)に適用させるには、setlocale関数を呼ぶ必要があります。

    $locale = "en_US.UTF-8" or "ja_JP.UTF-8"... 
    これらはHTTPヘッダー(Accept-Language)、もしくは保存されたアカウント情報から取得する必要があります。
    
    setlocale(LC_ALL, $locale);  ... 全てのロケール対応関数用 
    例) gettextリソースの切り替え
    
    setlocale(LC_TIME, $locale); ... 日付のローけー屡対応関数用 
    例) 日付関数の書式の切り替え
    
    

  3. ユーザー文化に基づくフォーマット

    ロケール対応関数はsetlocale関数によってフォーマット(書式)を切り替えることができます。

    setlocale(LC_TIME, "en_US.UTF-8");
    strftime('%c'); ... 'Mon 01 Jan 2012...'を返します。(英語書式)
    
    setlocale(LC_TIME, "ja_JP.UTF-8");
    strftime('%c'); ... '2012年1月1日...'を返します。(日本語書式)
    
    *'%c'は、ロケール対応書式のパターンです。
    
    

  4. サーバーとユーザー間の時間の変換

    多言語でグローバル化されたwebサービスで時間を処理するには、GMT/UTCを使うことが推称されます。 date_default_timezone_setを使うことで、全てのユーザー活動を共通時間で管理し、各ユーザーのタイムゾーンに変換することができます。

    GMT/UTCの処理については、サーバーサイドプログラミングを参照してください。

    $timestamp = strtotime(gmdate("Y-m-d H:i:s"));  ... GMT/UTC タイムスタンプ
    
    date_default_timezone_set("Asia/Tokyo");  ... 日本のタイムゾーンを設定
    strftime('%c', $timestamp); ... 日本の現地時間を返す
    
    date_default_timezone_set("America/Los_Angeles");  ... アメリカのタイムゾーンを設定
    strftime('%c', $timestamp); ... アメリカの現地時間を返す
    
    
    * ユーザーのタイムゾーンはユーザーアカウント情報から取得すべきです。ログインしていないユーザーについては、アクセスIPのエリアか、ユーザーのWebブラウザのJavaScriptで知ることができます。
    JavaScriptでのタイムゾーンの取得については、ロケール、書式、タイムゾーン (JavaScriptの章)を参照してください。

国際化プログラミングトップへ


Copyright (C) 2012 Kokusaika JP, Inc.
本ドキュメントを無断で転載および引用することを禁じます。