スレッド表示 | フラット表示〕 全トピック 920 件中 760 番目 次≫ ≪前

includeの謎

created: 2003-11-06 02:08 | modified: 2003-11-06 17:57 | reply: 3

[894] includeの謎

user: ede | created: 2003-11-06 02:08
はじめまして。edeといいます。
いきなり本題ですが、少し奇妙なことがおきました。

http://127.0.0.1/test.phpは
<?php var_dump($_GET)?>
とだけ書いてあります。

一方http://127.0.0.1/test2.phpは
<?php
 $word = @$_GET['word'];
 include("http://127.0.0.1/test.php?word=$word");
?>
とだけ書いてあります。

ここで、
<form action=http://127.0.0.1:8080/test2.php method=post>
 <input type=text name=word>
 <input type=submit>
</form>
のwordにガンダムと書いてtest2.phpにアクセスします。

するとなぜか
array(1) {
["word"]=>
string(8) "ガンダダ"
}
と表示されます。
”マ”は何個でも”ダ”になります。それ以外の辞は変化しません。

includeの代わりにrequireでも同様です。
また、test.phpのあるサーバーが外のサーバーでも同じことが起きます。

いったい何がおきたのでしょうか。自分には手がつけられません。

サーバー:Apache/2.0.47 (Win32) PHP/4.3.3
文字コード:shift-jis
エディタ:TepaEditor
reply: 896 返信 編集 削除

[896] Re.includeの謎?

user: ゆうじ | created: 2003-11-06 12:24
> 一方http://127.0.0.1/test2.phpは
> <?php
>  $word = @$_GET['word'];
>  include("http://127.0.0.1/test.php?word=$word");
> ?>

ここですが、
$word の値はマルチバイト文字列なので、
test.php をinclude する前に、
URLエンコードが必要なのかな?と思うのですが、
私も良くわかりませんが、
このあたりが文字化けの原因ではないでしょうか。
<?php
$word = @$_GET['word'];
$word = rawurlencode($word);
include("http://127.0.0.1/test.php?word=$word");
?>
Parent: 894  reply: 897 返信 編集 削除

[897] Shift_JISは正しくエンコードされないようです。

user: hamaji | created: 2003-11-06 12:31
以下のソースで実験してみました。
<?php
$str1 = "ム";
$str2 = "ダ";
?>
<table>
<caption>エンコードデータ</caption>
<tr>
<td>対象文字</td>
<td>結果</td>
</tr>
<tr>
<td>ム</td>
<td><?php echo urlencode($str1) ?></td>
</tr>
<tr>
<td>ダ</td>
<td><?php echo urlencode($str2) ?></td>
</tr>
</table>
<br>
<table>
<caption>デコードデータ</caption>
<tr>
<td>対象文字<td>
<td>結果</td>
</tr>
<tr>
<td><?php echo urlencode($str1) ?></td>
<td><?php echo urldecode(urlencode($str1)) ?></td>
</tr>
<tr>
<td><?php echo urlencode($str2) ?></td>
<td><?php echo urldecode(urlencode($str2)) ?></td>
</tr>
</table>
結果
[EUC]
ム:%A5%E0
ダ:%A5%C0
[Shift_JIS]
ム:%83%80
ダ:%83_
となり"ム"を"ダ"と誤認識してるような感じです。
php.iniのmagic_quotes_gpcや、mbstring…あたりをいじってみましたが一緒でした。
ちなみにPOSTならデータを正しく表示してました。
Parent: 896  reply: 902 返信 編集 削除

[902] 解決

user: ede | created: 2003-11-06 17:57
なるほど。
文字コードをうまく変換できなかったわけですか。
echo $_GET['word']

等してもうまく表示されているので2バイト文字はphpがうまく変換していると思っていたのですが、完全ではないと。
きちっと書かないとだめなんですね。

$word = urlencode($word);
をはさんで見るとうまく行きました。

あと、UTF-8だけは何もしないでもム→ダのバグ(?)がおきませんでした。
一つ賢く...なったかな?
Parent: 897  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 760 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑