[PHP-users 35187] Re: UTF-8 での escapeshellcmd の文字化けについて

KOYAMA Tetsuji koyama @ hoge.org
2010年 5月 4日 (火) 15:47:09 JST


小山です。

2010/5/4  <phpsenyo @ yahoo.co.jp>:
> $localeのvar_dumpがfalseということはsetlocaleが失敗しているということでし
> ょうか。

そのようです。

> 見当違いかもしれませんが、ネットで調べて下記の設定を試してみたのですが、
> 一番上以外は全てfalseでした。
> $locale = setlocale(LC_ALL, 'Japanese_Japan.20932'); → string(20)
> "Japanese_Japan.20932"
> $locale = setlocale(LC_ALL, 'Japanese_Japan.51932'); → bool(false)
> $locale = setlocale(LC_ALL, 'ja_JP.eucJP'); → bool(false)
> $locale = setlocale(LC_ALL, "ja_JP.SJIS"); → bool(false)
> $locale = setlocale(LC_ALL, 'ja_JP.UTF-8'); → bool(false)

PHP の setlocale() のマニュアルのユーザコメントに

 http://www.php.net/manual/en/function.setlocale.php#84719
|  According to MSDN, Windows setlocale()'s implementation does not
support UTF-8 encoding.

とあります。そこからリンクされている MSDN のドキュメントを見ても

http://msdn.microsoft.com/en-us/library/x99tb11d.aspx
|  The set of available languages, country/region codes, and code
pages includes all those supported
|  by the Win32 NLS API except code pages that require more than two
bytes per character, such as
|  UTF-7 and UTF-8. If you provide a code page like UTF-7 or UTF-8,
setlocale  will fail, returning NULL.
| The set of language and country/region codes supported by setlocale
is listed in Language and
| Country/Region Strings.

とあるので、Windows の setlocale() で UTF-8 を設定するのは無理そうですね。

escapeshellcmd() の実装本体は、ext/standard/exec.c:273 にある php_escape_shell_cmd() という
C の関数です。それほど難しいロジックではないので、同様の機能を PHP で実装するのが
良いのではないでしょうか?

-- 
    小山哲志@テックスタイル
    koyama @ techstyle.jp : http://techstyle.jp/
    koyama @ hoge.org : http://d.hatena.ne.jp/koyhoge/


PHP-users メーリングリストの案内