<?php
print '可能';
?>
これをSJISエンコードで実行するとパースエラーになります。
SJISの'能'の文字コードの2バイト目が0x5cなのですが、このコードはASCIIにおけるバックスラッシュ(\)と同じなので、PHPエンジンからすると
print '0x94\';
となり、'がエスケープされてパースエラーになってしまうそうです。
SJISにはこのような地雷のような、マルチバイトがいくつか存在するそうです。最近構築するシステムは基本的にUTF-8なので、自分が遭遇したことはないのですが、他の人の質問に答えるために調べていて知りました。
これって、PHPでSJISは事実上扱えないと言うこと?
2007年11月16日
2007年11月02日
SJISでのカタカナ判定
if (preg_match("/^(?:\x83[\x40-\x96])+$/", $str)) {
echo "すべて全角カタカナである";
} else {
echo "すべて全角カタカナではない";
}
echo "すべて全角カタカナである";
} else {
echo "すべて全角カタカナではない";
}
UTF8でのひらがな判定
if (preg_match("/^(?:\xE3\x81[\x81-\xBF]|\xE3\x82[\x80-\x93])+$/", $str)) {
echo "すべて全角ひらがなである";
} else {
echo "すべて全角ひらがなではない";
}
echo "すべて全角ひらがなである";
} else {
echo "すべて全角ひらがなではない";
}
2007年10月30日
正規表現してみました。
<?php
$subject = "00/00/00\t99\t99/99/99\t99\t00/00/00\t40\t 99/99/99\t5";
//NN/NN/NN\tNN単位で抽出
preg_match_all("/\d{2}\/\d{2}\/\d{2}\t\d{1,}/i", $subject, $out);
//連結します。
$str = implode("-br-", $out[0]);
echo $str;
?>
↓
08/05/03 26-br-08/05/04 32-br-08/05/05 41-br-08/05/06 5
$subject = "00/00/00\t99\t99/99/99\t99\t00/00/00\t40\t 99/99/99\t5";
//NN/NN/NN\tNN単位で抽出
preg_match_all("/\d{2}\/\d{2}\/\d{2}\t\d{1,}/i", $subject, $out);
//連結します。
$str = implode("-br-", $out[0]);
echo $str;
?>
↓
08/05/03 26-br-08/05/04 32-br-08/05/05 41-br-08/05/06 5
2007年10月05日
HH:MI形式の時刻文字列の演算
<?php
$val1 = "09:30";
$val2 = "22:00";
$vals1 = explode(":", $val1);
$vals2 = explode(":", $val2);
//グリニッジとの時差(9時間)を補正して、1970年1月1日 00:00:00からの秒数に変換します。
$time1 = mktime( $vals1[0], $vals1[1], 0, 0, 0, 0 ) + 60*60*9;
$time2 = mktime( $vals2[0], $vals2[1], 0, 0, 0, 0 ) + 60*60*9;
//時間の加算処理
$time3 = $time2 + $time1;
$time = date("H:i", strtotime("-9 hour", $time3));
echo "$val2 + $val1 = ".$time;
//時間の減算処理
$time3 = $time2 - $time1;
$time = date("H:i", strtotime("-9 hour", $time3));
echo "$val2 - $val1 = ".$time;
?>
//処理的には上と同じ、date_default_timezone_setでデフォルトのタイムゾーンを
//グリニッジ(GMT)にした場合です。プログラムで時間を補正する必要がないです。
//ただし、スクリプト内のタイムゾーンが日本でなくなるので注意。
<?php
$val1 = "09:30";
$val2 = "22:00";
$vals1 = explode(":", $val1);
$vals2 = explode(":", $val2);
date_default_timezone_set("GMT");
$time1 = mktime( $vals1[0], $vals1[1], 0, 0, 0, 0 );
$time2 = mktime( $vals2[0], $vals2[1], 0, 0, 0, 0 );
$time3 = $time2 + $time1;
$time = date("H:i", $time3);
echo "$val2 + $val1 = ".$time;
$time3 = $time2 - $time1;
$time = date("H:i", $time3);
echo "$val2 - $val1 = ".$time;
?>
$val1 = "09:30";
$val2 = "22:00";
$vals1 = explode(":", $val1);
$vals2 = explode(":", $val2);
//グリニッジとの時差(9時間)を補正して、1970年1月1日 00:00:00からの秒数に変換します。
$time1 = mktime( $vals1[0], $vals1[1], 0, 0, 0, 0 ) + 60*60*9;
$time2 = mktime( $vals2[0], $vals2[1], 0, 0, 0, 0 ) + 60*60*9;
//時間の加算処理
$time3 = $time2 + $time1;
$time = date("H:i", strtotime("-9 hour", $time3));
echo "$val2 + $val1 = ".$time;
//時間の減算処理
$time3 = $time2 - $time1;
$time = date("H:i", strtotime("-9 hour", $time3));
echo "$val2 - $val1 = ".$time;
?>
//処理的には上と同じ、date_default_timezone_setでデフォルトのタイムゾーンを
//グリニッジ(GMT)にした場合です。プログラムで時間を補正する必要がないです。
//ただし、スクリプト内のタイムゾーンが日本でなくなるので注意。
<?php
$val1 = "09:30";
$val2 = "22:00";
$vals1 = explode(":", $val1);
$vals2 = explode(":", $val2);
date_default_timezone_set("GMT");
$time1 = mktime( $vals1[0], $vals1[1], 0, 0, 0, 0 );
$time2 = mktime( $vals2[0], $vals2[1], 0, 0, 0, 0 );
$time3 = $time2 + $time1;
$time = date("H:i", $time3);
echo "$val2 + $val1 = ".$time;
$time3 = $time2 - $time1;
$time = date("H:i", $time3);
echo "$val2 - $val1 = ".$time;
?>