4

クライアントから提供されたロケール識別子名(文字列)のみから始めて、そのロケールのデフォルトの「リスト区切り文字」文字をどこでどのように検索しますか?

「リスト区切り文字」設定は、文字列や配列を結合または分割するときに、さまざまな種類のアプリケーションやプログラミング言語がデフォルトのグループ化文字として使用できる文字です。これは、スプレッドシートプログラムでCSVファイルを開く場合に特に重要です。多くの場合、これはコンマ「、」ですが、このデフォルトの文字は、マシンのリージョン設定によって異なる場合があります。OSによっても異なる場合があります。

ここでは自分のサーバー環境には興味がありません。代わりに、クライアントが私に与えたロケール識別子に基づいてクライアントについてもっと知る必要があるので、私自身のサーバー設定は関係ありません。また、このソリューションでは、この値を検索するためのショートカットとして、現在のプロセス全体のクライアントのロケール設定と一致するようにこのサーバーのロケール設定を変更することはできません。

これがICUライブラリで定義されている場合、INTL拡張子を使用してこの値を検索する方法を見つけることができません。

ヒントはありますか?

4

2 に答える 2

1

私の答えがあなたの要件を満たすかどうかはわかりませんが、(特にサーバー上のロケールを変更したくないので)答えを与える関数を使用することをお勧めします:

私の知る限り(そしてウィキペディアのようです)、ロケールの小数点がコンマでない限り、CSVのリストセパレーターはコンマです。その場合、リストセパレーターはセミコロンです。

したがって、次のコマンドを使用して、コンマ (Unicode U+002C) を区切り記号として使用するすべてのロケールのリストを取得できます。

cd /usr/share/i18n/locales/
grep decimal_point.*2C *_* -l

次に、このリストを取得して、適切なリストセパレーターを決定できます。

function get_csv_list_separator($locale) {
    $locales_with_comma_separator =  "az_AZ be_BY bg_BG bs_BA ca_ES crh_UA cs_CZ da_DK de_AT de_BE de_DE de_LU el_CY el_GR es_AR es_BO es_CL es_CO es_CR es_EC es_ES es_PY es_UY es_VE et_EE eu_ES eu_ES@euro ff_SN fi_FI fr_BE fr_CA fr_FR fr_LU gl_ES hr_HR ht_HT hu_HU id_ID is_IS it_IT ka_GE kk_KZ ky_KG lt_LT lv_LV mg_MG mk_MK mn_MN nb_NO nl_AW nl_NL nn_NO pap_AN pl_PL pt_BR pt_PT ro_RO ru_RU ru_UA rw_RW se_NO sk_SK sl_SI sq_AL sq_MK sr_ME sr_RS sr_RS@latin sv_SE tg_TJ tr_TR tt_RU@iqtelif uk_UA vi_VN wo_SN");
    if (stripos($locales_with_comma_separator, $locale) !== false) {
        return ";";
    }
    return ",";
}

(ロケールのリストは、私自身の Debian マシンから取得したものです。リストの完全性についてはわかりません)

この静的なロケールのリストを保持したくない場合 (これはそれほど頻繁には変更されないと思いますが) は、もちろん、上記のコマンドを使用してリストを生成し、キャッシュすることができます。

最後に、RFC4180 セクション 2.6によると、リスト区切り文字は実際には変更されませんが、コンマを含むフィールド (ロケールによっては浮動小数点数も意味します) は二重引用符で囲む必要があります。ただし (上記のリンクのように) RFC 標準に従っている人は多くありません。

于 2013-02-17T19:28:45.653 に答える
0

「リストセパレータ」のようなロケール設定はありませんが、ソフトウェア固有である可能性がありますが、ユーザー固有ではないかと思います。

ただし...ユーザーのロケールを検出して、設定を一致させることができます。

  1. ブラウザのロケールを取得します。$accept_lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'];これには、カンマ区切りの値のリストが含まれる場合があります。ただし、一部のブラウザはこれを送信しません。詳細はこちら...

  2. 次に、ここで詳細setlocale(LC_ALL, $accept_lang);を使用して利用可能なロケール設定を使用および取得できます $locale_info = localeconv(); ...

于 2013-02-18T08:25:12.727 に答える