人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

phpをutf-8で書いていますが下記のような現象に悩まされています。
なぜでしょうか?
mbstring.internal_encodingは「EUC-JP」です
php.iniで「mbstring.internal_encoding = "UTF-8"」しています。
事情があってどうしても「utf-8」で書かなければいけないので解決方法を教えてください。
(レンタルサーバーなので基本的な設定の変更は行えません)

よろしくお願いします。

// これは正常に動作します
$fp = fopen("./hoge.txt", "a");
set_file_buffer($fp, 0);
flock($fp, 2);
for($i = 0; $i < 10; $i++){
fwrite($fp, $i);
}
flock($fp, 3);
fclose($fp);

// これは何も出力されません
$fp = fopen("./hoge.txt", "a");
set_file_buffer($fp, 0);
flock($fp, 2);
for($i = 0; $i < 10; $i++){
fwrite($fp, "$i?n");
}
flock($fp, 3);
fclose($fp);

// これは改行がそのまま「?n」と出力されてしまいます
$fp = fopen("./hoge.txt", "a");
set_file_buffer($fp, 0);
flock($fp, 2);
for($i = 0; $i < 10; $i++){
fwrite($fp, $i . "?n");
}
flock($fp, 3);
fclose($fp);

// これは正常に動作します(きちんと改行もされます)
$fp = fopen("./hoge.txt", "a");
set_file_buffer($fp, 0);
flock($fp, 2);
for($i = 0; $i < 10; $i++){
fwrite($fp, "$i
");
}
flock($fp, 3);
fclose($fp);




●質問者: worldtravel
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:EUC-JP Flock FP hoge PHP
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● tobeoscontinue
●23ポイント
// これは何も出力されません
fwrite($fp, "$i?n");

>// これは何も出力されません

>fwrite($fp, "$i?n");

バックスラッシュのコードが違っているように見えます。

(上記は同じ物をコピペしたものですが片方は円記号に、片方は何て言うのかチョンとした記号に見えます)

そのため$iではなく$i[違うコード]nのような変数と解釈され、

そのような変数が無いため、出力されていないものと思います。

バックスラッシュは『ろ』のところではなく、円記号の方で

してみて下さい。

// これは改行がそのまま「?n」と出力されてしまいます

も同じ理由です。


これ事態はmbstring.internal_encodingと関係ありません。

◎質問者からの返答

ありがとうございます。

?は円マークを押しています。

(コード自体はmacで書いていますが...)

ちなみに上記のコードを書いたファイルをutf-8で保存して実行するとおかしくなります。

euc-jpで保存して実行すると全て正常に動作します。

他に何かありましたらお願いします。


2 ● chankaz
●23ポイント

コード自体はmacで書いていますが...

もしかしたら、保存の際に、「改行コード = CR」で保存しているのでは?

もしそうなら、「\n」では改行できないと思います。


試しに、PHPスクリプトもログファイルも「LF」で保存してみるとどうなりますか?


「CR」でしか保存できないのなら、「LF」で保存できるエディタを入手するか、または上記コードの「\n」を「\r」に変えてみてはいかがでしょうか。

◎質問者からの返答

ありがとうございます。

改行は「LF」で保存しています。


3 ● tobeoscontinue
●22ポイント

なるほどすいませんでした。

Shift_JISなんですねぇ。

Shiuft_JISの円記号(0x5c)はutf-8では0xc2a5という全角の

バックスラッシュのようになってしまうんですよねぇ。

eucの0x5cはバックスラッシュなのでutf-8でも0x5cなんですが。


>ちなみに上記のコードを書いたファイルをutf-8で保存して実行するとおかしくなります。

utf-8で保存する時にShift_JISからutf-8へ変換されて変になっている(文字化け)ので、先にutf-8を指定して、書いてから保存すれば問題ないはずです。

PHPは0x7fまではエンコードには関係しないのでこの場合は

mbstring.script_encoding

mbstring.internal_encoding

も関係ないはずです。

原因はutf-8で保存したコード変換による文字化けです。



携帯向けでなければutf-8で書いた方が無駄なコード変換が少なくていいように思います。

Shift_JISで書くのであれば、mbstring.script_encodingをSJISにします(Shift_JISで書いているのでShift_JISで認識しろ)

mb_strlen()のような文字列操作をするのであればmbstring.internal_encodingをセットする必要があります。

その場合、scriptのエンコードとinternalのエンコードが違うと、必要に応じてコード変換が必要になり非常に繁雑です。

mbstring.script_encoding

mbstring.internal_encoding

は同じエンコード(この場合はutf-8)にしてutf-8で書くのが一番問題がないと思います

どうも上手く説明できませんorz

◎質問者からの返答

ありがとうございます。

Shift_JIS ? は使っていませんが...

ECUで書いたものをUTF-8に変換して保存してます。

変換前のEUCの状態だと正常に動くのですが、UTF-8に変換すると正常では無くなります。

> 携帯向けでなければutf-8で書いた方が無駄なコード変換が少なくていいように思います。

ECUではなくてですか?


4 ● hamster009
●22ポイント

だから、エディタが悪いんですって!emacsとかvimで書いてみてください。といっても、macでこれらをutf8で使えるようにするのはひと苦労ですが。

◎質問者からの返答

ありがとうございます。

現在「Jedit 4.0」というものを使っているのですがこれでは不足でしょうか?

文字コードや改行コードもかなり色々と設定できますが...


追記です

Windowsの JmEditor2 で書いたら問題なく動作しました。

また、そのファイルをmacでダウンロードして改行をコピーペースとしたらこちらも問題なく動作しました。

やはりmacで作るのはやめた方がよいのでしょうか???

どうしても使い慣れているので...

ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ