2007年11月16日

PHPの5C問題

<?php
print '可能';
?>

これをSJISエンコードで実行するとパースエラーになります。
SJISの'能'の文字コードの2バイト目が0x5cなのですが、このコードはASCIIにおけるバックスラッシュ(\)と同じなので、PHPエンジンからすると
print '0x94\';
となり、'がエスケープされてパースエラーになってしまうそうです。

SJISにはこのような地雷のような、マルチバイトがいくつか存在するそうです。最近構築するシステムは基本的にUTF-8なので、自分が遭遇したことはないのですが、他の人の質問に答えるために調べていて知りました。

これって、PHPでSJISは事実上扱えないと言うこと?
posted by 台北猫々 at 23:08| Comment(1) | TrackBack(0) | 技術メモ(PHP)

2007年11月02日

SJISでのカタカナ判定

if (preg_match("/^(?:\x83[\x40-\x96])+$/", $str)) {
echo "すべて全角カタカナである";
} else {
echo "すべて全角カタカナではない";
}
posted by 台北猫々 at 21:35| Comment(0) | TrackBack(0) | 技術メモ(PHP)

UTF8でのひらがな判定

if (preg_match("/^(?:\xE3\x81[\x81-\xBF]|\xE3\x82[\x80-\x93])+$/", $str)) {
echo "すべて全角ひらがなである";
} else {
echo "すべて全角ひらがなではない";
}
posted by 台北猫々 at 21:31| Comment(0) | TrackBack(0) | 技術メモ(PHP)

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
posted by 台北猫々 at 21:30| Comment(0) | TrackBack(0) | 技術メモ(PHP)

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;

?>
posted by 台北猫々 at 23:55| Comment(0) | TrackBack(0) | 技術メモ(PHP)