获取任何区域设置的“列表分隔符”字符

时间:2013-02-03 22:48:11

标签: php csv locale intl

仅从客户端提供的区域设置标识符名称(字符串)开始,我如何或在何处查找该区域设置的默认“列表分隔符”字符?

“列表分隔符”设置是许多不同类型的应用程序和编程语言在连接或拆分字符串和数组时可用作默认分组字符的字符。这对于在电子表格程序中打开CSV文件尤为重要。虽然这通常是逗号“,”,但根据机器的区域设置,此默认字符可能会有所不同。它可能在OS之间有所不同。

我对自己的服务器环境不感兴趣。相反,我需要根据他们给我的区域设置标识符了解更多有关客户端的信息,因此我自己的服务器设置无关紧要。此外,对于此解决方案,我无法更改此服务器上的区域设置以匹配整个当前进程的客户端作为查看此值的快捷方式。

如果这是在ICU库中定义的,我无法使用INTL extension找到任何查找此值的方法。

任何提示?

2 个答案:

答案 0 :(得分:1)

我不确定我的答案是否能满足您的要求,但我建议(特别是因为您不想更改服务器上的语言环境)使用能给您答案的功能:

据我所知(and also Wikipedia's it seems)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 section 2.6,列表分隔符实际上永远不会改变,而是包含逗号的字段(因此这也意味着浮动数字,取决于语言环境)应该用双引号括起来。虽然(如上所述)没有多少人遵循RFC标准。

答案 1 :(得分:0)

没有这样的区域设置作为“列表分隔符”它可能是特定于软件的,但我怀疑它是用户特定的。

然而......您可以检测用户的区域设置并尝试匹配设置。

  1. 获取浏览器区域设置:$accept_lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'];这可能包含逗号分隔值列表。有些浏览器不会发送此信息。 more here...

  2. 接下来,您可以使用setlocale(LC_ALL, $accept_lang);并使用$locale_info = localeconv(); more here...

  3. 获取可用的区域设置