文字コード

サーバーにアップロードした PHP を呼び出すコードです。
<a href="http://maedakobe.rw.xsi.jp/php/hello_bom.php">Hello! PHP</a>
次のリンクをクリックするとサーバー上の hello_bom.php(utf-8 BOM 有り)が実行されます。
Hello! PHP

文字コード

  1. 昔(Windows7 以前)は Shift_JIS が使われていたのですが、最近では Unicode が主流になってきました。
    Unicode には BOM が格納されているものと、格納されていないものがあります。
    BOM(byte order mark)とはテキストファイルの先頭に格納される文字コードを示すIDです。
    BOM が格納されていると文字コードの自動認識ができて、文字化けすることなく正しく読むことができます。
    文字コード BOM 説明
    utf-16 FFFE 先頭2バイトが BOM です
    utf-8(BOM有り) EFBBBF先頭3バイトが BOM です
    utf-8(BOM無し) BOM は格納されていません
    Shift_JIS BOM は格納されていません
    Windows10 の「アクセサリ/メモ帳」でタイプすると規定値では utf-8(BOM 無し)になります。
    「名前を付けて保存・開く」を選ぶと文字コードを選んで「保存・入力」が出来るようになっています。
    PHP に関係する文字コードは表に掲載したした4種類ですが、文字コードは山のように存在します。
    詳しい説明は Encoding クラス を参照して下さい。
  2. 2020/05 現在 HTML やソースプログラムに最も多く使われている文字コードは utf-8 です。
    私のページでも C++ や C# 関係のプログラムファイルや HTML のソースファイルは utf-8(BOM有り)を使っています。
    所が PHP では全てのソースファイルを utf-8(BOM有り)に統一すればOKとは行かないようです。
    ファイルの種類 説明
    .html ホームページを記述する HTML 文が書かれたファイル
    .php(ネット) サーバー上で実行される PHP のプログラムファイル
    .php(コンソール) コマンドプロンプトで実行する PHP のプログラムファイル
    .php(ビルトインサーバー) ビルトインサーバーで実行される PHP のプログラムファイル
    .sql Data Base(SQLite)のコマンドが書かれたファイル

Hello! PHP

  1. PHP を実行すると HTML 文が吐き出されます。
    ブラウザは PHP が吐き出した HTML 文を実行してページを表示します。
  2. Windows10 で utf-8(BOM有り)でタイプした test_bom.php(Hello! test) です。
    <html>
    <head>
    <meta charset=utf-8">
    <title>Hello</title>
    </head>
    
    <body>
    <h1>Hello PHP!</h1>
    <?php
    print("Windows10 で Hello PHP! のページを表示します。<br>\r\n");
    print("文字コードは「utf-8(BOM 有り)」で書かれています。<br>\r\n");
    print("改行コードは 0D, 0A が使われています。<br>\r\n");
    ?>
    </body>
    </html>
    
  3. 2020/06/05 サーバーにアップロードする PHP の文字コードは utf-8(BOM 有り)が適しているようです。
    utf-8(BOM 有り)でタイプ出来ないときは Shift_JIS を使って下さい。
    ファイル名 文字コード サーバーで実行 説明
    hello_bom.php utf-8(BOM有り) hello_bom.php 正常に表示されます
    hello.php utf-8(BOM無し) hello.php 文字化けします
    hello_jis.php Shift_JIS hello_jis.php 正常に表示されます
    hello_utf16.phputf-16 hello_utf16.php テキスト異常
  4. PHP の文字コードの設定は php.ini の default_charset で行います。
    phpinfo() を表示して Loaded Configuration File が php.ini の場所です。
    サーバーの PHP info を表示する
    サーバーによっては php.ini を書き換えることも出来るようですが、私は規定値のまま使用します。
    詳細は PHPスクリプトが文字化けするとき 及び
    php.iniの文字コードの設定 を参照して下さい。

コンソールモードで実行

  1. 2020-06-05 Windows10 のコンソールモードで type コマンド を使ってテキストファイルの印字を確かめました。
    (type は MS/DOS の頃から使い慣れたコマンドです)
    1. shift_jis.txt を type コマンドで印字すると正常に印字されました。
      Microsoft Windows [Version 10.0.18363.836]
      (c) 2019 Microsoft Corporation. All rights reserved.
      
      C:\Users\maeda>CD C:\DATA\Test
      C:\DATA\Test>type shift_jis.txt
      
    2. utf8.txt(utf-8 BOM 無し)を印字すると文字化けします。
      w にリダイレクトして調べると utf-8(BOM 無し)で書かれていました。
      C:\DATA\Test>type utf8.txt > w
      
    3. utf8_bom.txt(utf-8 BOM 有り)を印字すると文字化けします。
      w にリダイレクトして調べると utf-8(BOM 有り)で書かれていました。
      C:\DATA\Test>type utf8_bom.txt > w
      
    4. utf16.txt を印字すると正常に印字されました。
      C:\DATA\Test>type utf16.txt
      
  2. C:\DATA\PHP\ に次のプログラムを格納してコンソールモードで実行した結果です。
    ファイル名 説明 実行結果
    hello.php utf-8(BOM無し) でタイプした PHP ファイル 正常に印字される
    hello_bom.php utf-8(BOM有り) でタイプした PHP ファイル 先頭にゴミ(・)が印字される
    hello_jis.php Shift_JIS でタイプした PHP ファイル 漢字が文字化けする
    hello_utf16.phputf-16 でタイプした PHP ファイル 英数字が全角になり漢字が文字化けする
    1. hello.php(utf-8 BOM無し)のソースコードです。
      <html>
      <head>
      <meta charset=utf-8">
      <title>Hello</title>
      </head>
      
      <body>
      <h1>Hello PHP!</h1>
      Windows10 で Hello PHP! のページを表示します。<br>
      文字コードは「utf-8 の BOM 無し」で書かれています。<br>
      改行コードは 0D, 0A が使われています。<br>
      </body>
      </html>
      
    2. コマンドプロンプトを起動して hello.php を実行します。
      c:\bin\php にパスが通っているときの PHP の起動です。
      C:\Users\maeda>cd c:\data\php
      C:\DATA\PHP>php hello.php
      
      パスが通っていないときは c:\bin\php\ で作業します。
      C:\Users\maeda>cd c:\bin\php
      C:\BIN\php>php c:\data\php\hello.php
      
    3. コンソールモードで hello.php(utf-8 BOM無し)を実行すると正常に印字されました。
      type コマンドで utf-8(BOM無し)のファイルを印字すると文字化けしていました。
      そこで Shift_JIS で吐き出されたのかと思いリダイレクトして調べると utf-8(BOM無し)で書かれていました。
      C:\BIN\php>php c:\data\php\hello.php > w
      
    4. PHP で hello_jis.php を実行すると漢字が文字化けします。
      リダイレクトして調べると Shift_JIS で書かれていました。
      C:\BIN\php>php c:\data\php\hello_jis.php
      
  3. 規定値を変更して Shift_JIS を使えるように設定することも出来るようです。
    1. PHP の文字コードの設定は php.ini の default_charset で行います。
      コンソールモードで Loaded Configuration File から php.ini のパスを調べたところ (none) になっています。
    2. PHP をインストールしたフォルダーを探して C:\BIN\php\php.ini-development と php.ini-production を見つけました。
      php.ini-production のファイル名を php.ini に変更します。
    3. php.ini の default_charset を“utf-8”⇒“Shift_JIS”に変更します。
      default_charset = “Shift_JIS”
      
    4. この状態で hello_jis.php を実行すると正常に実行されました。
      C:\BIN\php>php c:\data\php\hello_jis.php
      
  4. コンソールモードの文字コードは utf-8 を使う予定なので php.ini を元に戻します。
    Windows10 の環境で、PHP のコンソールモードのプログラムは「utf-8 BOM 無し」でタイプすることにします。

前田稔の超初心者のプログラム入門
PHP Program