2010年5月 4日

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

小山です。

2010/5/4 <phpsenyo@xxxxx>:
> $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@xxxxx : http://techstyle.jp/
koyama@xxxxx : http://d.hatena.ne.jp/koyhoge/
_______________________________________________
PHP-users mailing list PHP-users@xxxxx
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3


投稿者 xml-rpc : 2010年5月 4日 15:47
役に立ちました?:
過去のフィードバック 平均:(2) 総合:(2) 投票回数:(1)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/95516
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。