2

このスクリプトを実行すると:

<?php
$old_locale = setlocale(LC_ALL, '0');
setlocale(LC_ALL, $old_locale);

私は得る:

PHP Warning:  setlocale(): Specified locale name is too long in /tmp/loc.php on line 3
PHP Stack trace:
PHP   1. {main}() /tmp/loc.php:0
PHP   2. setlocale() /tmp/loc.php:3

も印刷$old_localeすると、次のようになります。

LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=en_US.UTF-8;LC_NAME=en_US.UTF-8;LC_ADDRESS=en_US.UTF-8;LC_TELEPHONE=en_US.UTF-8;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=en_US.UTF-8

最も基本的な「理由」は、確かに長すぎるロケール文字列を渡そうとしていることだと思います。私ext/standard/string.cが見る:

if (Z_STRLEN_PP(plocale) >= 255) {
    php_error_docref(NULL TSRMLS_CC, E_WARNING, "Specified locale name is too long");
    break;
}

PHP のバージョン:

PHP 5.4.13 (cli) (built: Mar 15 2013 11:27:51) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.2, Copyright (c) 2002-2013, by Derick Rethans

オペレーティング システム: 最新の CentOS リリース 6.4 (最終版)

localeコマンドラインからの実行の出力:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

Goodby, CSVを使用しているときに、この PHP 警告が発生しました。

4

2 に答える 2

3

set local の 2 番目のパラメーターは、文字列または配列のいずれかです。動作させるには、 $old_locale を分離する必要があると思います。

<?php
$old_locale = setlocale(LC_ALL, '0');
$bits = explode(';',$old_locale);
$loc = array();
foreach($bits as $bit) {
   $value = explode("=",$bit);
   $loc[] = $value[1];
}
setlocale(LC_ALL, $loc) ;
于 2013-04-19T18:10:43.077 に答える
1
$old_locale = explode(";", $old_locale);
$old_locale = $old_locale[0];//returns LC_CTYPE=en_US.UTF-8
$old_locale = explode("=", $old_locale);
$old_locale = $old_locale[1];//returns en_US.UTF-8
setlocale(LC_ALL, $old_locale);
于 2013-04-19T18:12:04.087 に答える