浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

【PHP】SJIS で書かれたソースコードが原因のエラー例

 PHPのソースコードにおいてはマルチバイト文字の途中に ASCII のエスケープ文字、角かっこ等と一致する文字列が出てくると大体処理が壊れます。例えば次です。

<?php
echo "表";

 UTF-8 でこの文字列を保存したファイルを web サーバから実行すると、次の様に正常に表示されますが、

SJIS で保存して実行すると、次の様にエラーが出力されます。

これは SJIS の”表”が 0x95 0x5c の byte から構成され 0x5c が単体では”\”を表していることが原因です。このため SJIS のソースコードでは二つ目のダブルクォーテーションがエスケープされることになり、文法エラーとなりました。この文字コードによる意図しない文字が紛れる問題は PHP に限らずしばしば起こります(MySQL など)。

 他ファイルを読み込む時に問題が起きることもあります。例えば次です。

<?php
/** SJIS で書かれたファイル sjis_var.php */
$ほげ = 'hoge'

<?php
/** UTF-8 で書かれたファイル utf8.php */

// SJIS で書かれたソースコードを読み込み
require __DIR__. '/sjis_var.php';
// SJIS の"ほげ"と UTF-8 の"ほげ"は違う byte なので $ほげ は未定義変数として扱われる
var_dump([
    'isset' => isset($ほげ), // false
    'val' => $ほげ ?? null,// NULL
    'name' => 'ほげ',// "ほげ"
]);

// UTF-8 の"ほげ"を SJIS の"ほげ"に変換
$varName = mb_convert_encoding('ほげ', 'SJIS-win', 'UTF-8');
// SJIS の"ほげ"の byte をキーにして↑同様に読むと定義された変数であることがわかる
var_dump([
    'isset' => isset($$varName), // true
    'val' => $$varName ?? null, // hoge
    'name' => $varName, // "�ق�"
]);

 こんな感じで何かと事故を起こしやすいのでソースコードは UTF-8 に統一しておくのが無難です。

  • この記事いいね! (0)