質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.07%

PHP実行後の文字化け

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,112

gsuisk

score 72

PHPの参考書で勉強していて、現在の日付を日付フォーマットで出力するということを以下のコードで実行しました。

class Day{

  public static function fmt($date){
    $str = $date->format('y年m月d日');
    return $str;
  }

}

$now = new DateTime();
echo Day::fmt($now);

実行結果は正しく表示されたのですが、実行後にコードを見てみたら 
('y年m月d日') の部分が ('yå¹´m月dæ—¥') このように文字化けしていました。

文字化けしたまま再び実行しても結果は正しく表示されます。

何度('y年m月d日')に戻しても、実行するとコードは文字化けします。

なぜでしょうか?

また、もう一つ疑問な点がありまして、、、

$now = new DateTime();

これはPHPが元から用意しているDateTimeクラスから$nowというインスタンスを作成しており、
->format() はDateTimeクラスのformatメソッドを使用している。という認識で正しいでしょうか?

回答いただけると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

ちょっと調べました、

('y年m月d日');

('y年m月d日');

と表示されるパターンはUTF-8で保存されたファイルをLatin1で開くとこうなるっぽいです。

ので、UTF-8対応のエディタで開いてみてください。

$now = new DateTime();


の認識はそれで大丈夫です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/30 02:17

    mb_internal_encodingやらmb_detect_encodingで全てUTF-8ってでてるパターンはUTF-8で保存してるパターンしかなかったので、保存自体に問題はなさそう・・・

    キャンセル

  • 2017/08/30 17:54

    試しに別のエディタ(Brackets)で問題のファイルを開いても文字化けしませんでした。
    再びAtomで同じファイルを開くと文字化けしました。

    なのでこれはエディタの問題ですよね。。。

    キャンセル

  • 2017/08/30 17:56

    Atomを一度アンインストールしようと思います。

    PHPファイルはローカルディスク下にあるのでエディタをアンインストールしてもファイルは消えませんよね?

    キャンセル

0

PHPはあえてそうしない限り、実行時に実行したファイルの中身を変化するようなことはないです。それは、ファイルの更新のタイムスタンプを見ればわかると思います。なので、ファイル自体は保存したときのままです。
実行して動くってことはファイルと実行環境の間では文字化けはないってことです。
だから、ファイルを開いたエディタの表示している文字コードがファイルの文字コードとあっていないだけでは?

また、もう一つ疑問な点がありまして、、、 
$now = new DateTime();
これはPHPが元から用意しているDateTimeクラスから$nowというインスタンスを作成しており、

そうです

->format() はDateTimeクラスのformatメソッドを使用している。という認識で正しいでしょうか? 

$nowっていうインスタンスのformatメソッドじゃないかな?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/30 00:20

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

    エディタ(Atom)の設定ではファイルの文字コードはUTF-8になっているので、エディタの表示している文字コードが異なるのでしょうか?これを調べる方法はあるでしょうか?

    「formatメソッドを持つDateTimeクラス」をコピー(インスタンス化)したものが$nowで、当然$nowもformatメソッドを持っていて、それを利用した。
    正確に言うとこういうことでしょうか?

    キャンセル

0

冒頭でheaderにてcharsetでutf8と宣言してみては?

<?php
header('Content-Type: text/html; charset=UTF-8');

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/30 17:59

    試しましたがだめでした、、

    Failed to activate the bracket-matcher package

    Uncaught TypeError: Cannot read property 'openScopes' of undefined

    というエディタのエラーが出てファイルの中身が空になるという状態です。

    他のエディタでは問題ないのでAtomをアンインストールしようと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る