[PHP-dev 756]Re: zend-multibyteの挙動について

Moriyoshi Koizumi moriyoshi @ at.wakwak.com
2003年 5月 6日 (火) 01:09:38 JST


小泉です。

Rui Hirokawa <rui_hirokawa @ ybb.ne.jp> wrote:

> > ここで下位互換性のほかに考えなくてはいけない点は、script_encoding と 
> > internal_encoding が一致しないケースは混乱を招きやすい、ということでしょう
> > か。たとえば、http_input が EUC-JP で、script_encoding が Shift_JIS で
> > internal_encoding が UTF-8 というのが原理的に可能ですし、場合によっては便
> > 利でしょうが、全面的に有益かというと、どうでしょうか。この組み合わせが許さ
> > れる場合と、許されない場合があることは、スクリプトの総合的なポータビリティ
> > を阻害します。
>
> よく理解できていないのですが、こと日本語に関しては、Shift_JISでスクリプ
> トを書きたいが、パース時等に問題を発生してしまうというニーズからきている
> 機能だと思っています。

後で見てみると何のこっちゃ?というような文章でしたので、例を出すことにしま
す。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
<title>test</title>
</head>
<body>
<?php
/*
 * php.ini の設定:
 * output_handler=mb_output_handler
 * mbstring.language=Japanese
 * mbstring.encoding_conversion=On
 * mbstring.http_input=EUC-JP
 * mbstring.http_output=EUC-JP
 * default_charset=EUC-JP
 * mbstring.internal_encoding=UTF-8
 * mbstring.script_encoding=Shift_JIS
 *
 * このスクリプト自体は Shift_JIS で記述されていると思ってください。
 *
 */

if (isset($_POST['text'])) {
    $fp = fopen('/tmp/out', 'wb');
    fwrite($fp, $_POST['text']);
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<textarea name="text">
</textarea>
<br />
<input type="submit" value="送信" />
</form>
</body>
</html>

このとき、このページの内容自体は EUC-JP で送信されますが、
フォームに文字を入れて、[送信] したとき、
/tmp/out には、POST されたデータが UTF-8 で書き込まれることになります。
ただし、設定をちゃんと理解していないと、
スクリプトが Shift_JIS で記述されているのに、ページは EUC-JP は出力されて、
クッキーやデータベース等はそのままでは UTF-8 で書き込まれることになります
から、混乱が生じます。

繰り返しになってしまいますが、
GPC 入力時のコードマップ変換と、mb_output_handler での出力変換の目的も、
zend multibyte と同じで、スクリプトを Shift_JIS で安全に書けないという
ことから生じた必要性にあると理解しています。確かに目的は同一ですが、
実現方針としては衝突するもの同士ですので、同じ encoding_conversion
スイッチで On Off されるのはおかしい気がします。

> 昨年開催したPHP国際化関連の打ち合わせでもこの辺の話題になり、
> 「上記のニーズが実現できれば、一般のPHPユーザにとっては、内部文字コード
> などは(極論すれば)どうでも良い話では?」という意見もでました。

NEC/IBM拡張文字などを含むいわゆる「機種依存文字」を用いた旧システムを移行
する際に、UTF-8 決めうちでは問題が生じる場合もあるでしょうし、Perl 6 など
と違って現状のように複数の選択肢が用意されている方が良いように思えます。

> 私も、Shift_JIS、EUC-JP、UTF-8でスクリプトが書けるということは、ユーザに
> とって有用だと思いますが、内部文字コードを選択できるということは
> ユーザに不要な混乱を招いていると感じていますし、混乱を避けるという意味で
> は、内部文字コードはデフォルト値(現状ではUTF-8?)に統一した方が良いので
> はと思います。

個人的には、zend multibyte が有効の場合は、常に 
script_encoding=internal_encoding になるようにするのがいいと思います。
つまり、script_encoding を廃止して、internal_encoding 一本にするという意味
です。もちろん、幾つかの mb_send_mail() などのユーザ関数は、
internal_encoding の設定に依存しているものもありますので、
注意しなくてはなりませんが。



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