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);


回答の条件
  • 1人5回まで
  • 登録:2006/12/16 22:51:35
  • 終了:2006/12/17 11:53:59

回答(4件)

id:tobeoscontinue No.1

tobeoscontinue回答回数214ベストアンサー獲得回数542006/12/16 23:39:37

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

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

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

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

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

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

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

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

してみて下さい。

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

も同じ理由です。


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

id:worldtravel

ありがとうございます。

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

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

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

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

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

2006/12/17 00:37:28
id:chankaz No.2

chankaz回答回数53ベストアンサー獲得回数32006/12/17 01:01:26

ポイント23pt

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

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

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


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


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

id:worldtravel

ありがとうございます。

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

2006/12/17 02:14:53
id:tobeoscontinue No.3

tobeoscontinue回答回数214ベストアンサー獲得回数542006/12/17 01:33:34

ポイント22pt

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

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

id:worldtravel

ありがとうございます。

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

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

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

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

ECUではなくてですか?

2006/12/17 02:21:02
id:hamster009 No.4

hamster009回答回数3431ベストアンサー獲得回数502006/12/17 03:34:11

ポイント22pt

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

id:worldtravel

ありがとうございます。

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

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


追記です

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

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

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

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

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

2006/12/17 11:53:45
  • id:tobeoscontinue
    >現在「Jedit 4.0」というものを使っているのですがこれでは不足でしょうか?
    ご質問の件はコード変換によるものなのでエディターの問題ではないです。

    >ECUで書いたものをUTF-8に変換して保存してます。
    うぅ。EUCなら変換で問題にならないはずですが、謎です。

    >> 携帯向けでなければutf-8で書いた方が無駄なコード変換が少なくていいように思います。
    >ECUではなくてですか?
    XMLでは標準のcharsetはutf-8になっています。EUCなども使えるとは思いますが。
    オープンソースのツールが言語に対応する場合、utf-8は使える可能性はありますがEUCが使えるのはまず無いでしょう。
    そのような事から無駄なコード変換をせずに済むutf-8で書くのがいいように思います。

    どのコード体系でもいいのですが
    個人的に上記の理由などからそう思っただけです。
    utf-8はShift_JISやEUCに比べて大きくなるという欠点はありますが。
    もろもろを考慮してどのコード体系を使うか決められたらいいと思います
  • id:hamster009
    これ使ってみてください。アイコンを/Applicationsにドロップするだけで使えます。
    http://homepage.mac.com/zenitani/emacs-j.html

    utf-8にするには、Options->Mule->Set language Environment->UTF8
    あるいは、
    .emacsに
    (set-language-environment 'utf-8)
    と書いておく。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません