※ パクレゼルヴではWeb開発エンジニアを大募集中!詳細はこちら

Archive

Archive for the ‘未分類’ Category

fgetcsvがphp5で文字化けする  

2010/5/31 月曜日 20:45:08

仕事でCSVを使うことがあったんですけど、その時に悩んだことを書こうと思います。

fgetcsv()という便利な関数があるんですが、php5で使うと文字化けするんですよ。
なぜ文字化けが起きるのかと言うと、
「fgetcsvはマルチバイト文字の2バイト目に’\'があると、直後のダブルクォーテーションをエスケープするという、少なくともエクセルの仕様にはない独自解釈をする。」
らしい。
訳わかんない事言ってるなーと思いますが、要はShift-JIS形式のCSVをfgetcsv()関数でと文字化けするみたいです。

いろいろと調べた結果、
「PHP 5.0 の fgetcsv() はロケールの設定に依存します。」
とのことなので、

setlocale('LC_ALL', ja_JP.EUC_JP);

でロケールを設定してあげれば直ら・・・・ない。
ぱっと見た感じ直ってるように見えるんですけど、機種依存文字が化けてしまう。

それじゃあCSVをまずUTF-8とかに変換しちゃえば解決するんですけど、実はfgetcsvぽく動いて、しかもバグがない
関数があったので、それを使うことに。

function fgetcsv_reg (&$file, $length = null, $d = ',', $e = '"') {
	$d = preg_quote($d);
	$e = preg_quote($e);
	$_line = "";
	$eof = FALSE;
	while (!$eof && !feof($file)) {
		$_line .= (empty($length) ? fgets($file) : fgets($file, $length));
		$itemcnt = preg_match_all('/'.$e.'/', $_line, $dummy);
		if ($itemcnt % 2 == 0) $eof = true;
	}
	$_csv_line = preg_replace('/(?:\r\n|[\r\n])?$/', $d, trim($_line));
	$_csv_pattern = '/('.$e.'[^'.$e.']*(?:'.$e.$e.'[^'.$e.']*)*'.$e.'|[^'.$d.']*)'.$d.'/';
	preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
	$_csv_data = $_csv_matches[1];
	for($_csv_i=0;$_csv_i<count ($_csv_data);$_csv_i++){
		$_csv_data[$_csv_i]=preg_replace('/^'.$e.'(.*)'.$e.'$/s','$1',$_csv_data[$_csv_i]);
		$_csv_data[$_csv_i]=str_replace("'","\\'",$_csv_data[$_csv_i]);
		$_csv_data[$_csv_i]=str_replace($e.$e, $e, $_csv_data[$_csv_i]);
	}
	return empty($_line) ? false : $_csv_data;
}

この関数で、CSVを正規表現で切ってます。
使うときはこういう感じで

$new_data = array();
$header = array('name','zip','addr','tel','fax','manage','security','url');

$filename = 'CSVファイルパス';
$file = fopen($filename, "r");

while (($data = fgetcsv_reg($file)) !== false) {
	$_enc_to=mb_internal_encoding();
	$_enc_from=mb_detect_order();
	mb_convert_variables($_enc_to,$_enc_from,$data);
	$num = count($data);
	for ($c=0; $c < $num; $c++) {
		$new_data[$header[$c]] = $data[$c];
	}
	foreach($new_data as $key => $val){
		echo $key." : ".$val."<br />";
	}
}

こういう風に使えば、fgetcsv()関数とほぼ同じ動作をし、さらに文字化けもおきません。

こういうオリジナルの関数を自分でも作れるようになりたいですね。。

つっしー PHP, 未分類

表示で長い文字列を丸める!(自力篇)  

2008/12/2 火曜日 16:37:01

なんか便乗。
mb_strimwidth関数なんてシラネーって時に自力でやってました。
それ以前にPHPってここまで考慮されてるんだなーと、標準関数の多さにびっくらこきました。

で、自力でやってた感じは文字のバイト数見たりいろいろして変換。

function FN_chktext($text, $byte){
	// HTMLタグを取除く
	$text = strip_tags($text);

	// 文字変換
	mb_internal_encoding("SJIS");
	$text = mb_convert_kana($text, "RNASKH");

	// 文字数取得
	$t_num = mb_strlen($text);

	if ($t_num > $byte){
		$text = mb_substr($text, 0, $byte);
		$text .= "..";
		$text = mb_convert_kana($text, "s");
	}
	return $text;
}

たまーに中途半端なところで切れたりして文字化ける始末で、面倒だったりします。
でもって、たぶん普通にmb_strimwidth使った方が早いです、はい。

下音タヌキ 未分類

iPhoneて携帯じゃないの?  

2008/8/20 水曜日 10:19:59

流行に遅れないボクです。

iPhoneが発売されて、それなりにたちました。
iPhoneはフリーダムに戦ってます。
他の携帯メーカーは、キャリアの出したガッチガチに固められた仕様、いろんな要望を元に開発してると思うんです。
だけど、iPhoneは、SoftBankの回線を使っているだけで、他はSoftBankのロゴすらついていないApple仕様。

フリーダムだから完全じゃなくていいんです。
便利な時代になって、ネットでファームウェアアップデートできちゃうものですから。
iPhoneなんかはファームウェアが上がる度に、機能が増えていく。

携帯メーカーはこれがないんです;;
アップデートって言っても、ただのバグ修正。
微々たる新機能は、次の機種で・・というのが一般的ですね。
半年に新機能がポンポン出てきては、最近の割賦2年縛りなユーザーにとって厳しいものがあります。

携帯ももっとフリーダムにして、各メーカーの独自性とか出してもらいたいですね。
そうしちゃうと、各機種の仕様の違いによりいろいろ問題が出てくるデメリットが大きく開発者としては泣いちゃいますけど。

もっとエコにいきましょう。
Eco Idea!

下音タヌキ 未分類

いつのまにストリートビュー  

2008/8/12 火曜日 15:02:53

流行に敏感なボクです。

ちょっと時代遅れ気味なのですが、Googleマップにストリートビュー機能が追加されました。
地図に表示されているその場所の風景が写真で上下左右見えちゃうわけです。
以下がサンプル。
GLatLngのところに、前前々回あたりのGoogleMap記事でのMap座標を記述すれば、その場所のストリートビューが表示されます。

<html>
<head>
<script src="http://maps.google.com/maps?file=api&v=2.x&key=*****" type="text/javascript"></script>
<script type="text/javascript">

var myPano;

function map() {
	var point = new GLatLng(**.******,**.******);
	panoramaOptions = { latlng:point };
	myPano = new GStreetviewPanorama(document.getElementById("pano"), panoramaOptions);
	GEvent.addListener(myPano,"error",NoFlash);
}

function NoFlash(errorCode) {
	if (errorCode == FLASH_UNAVAILABLE) {
		alert("FLASHに対応しておりません。");
		return;
	}
}
</script>
</head>
<body onload="map()" onunload="GUnload()">
	<div name="pano" id="pano" style="width: 500px; height: 300px"></div>
</body>
</html>

動的に、座標部分が変更できるとおもしろそうです。
・・・そんなふうに考えてた時期がボクにもありました。

下音タヌキ 未分類

システム運用は障害を未然に防ぐのだ  

2008/7/3 木曜日 16:11:30

サロン系の服着てます。姜子牙です。そのせいか年齢相応に見られません。
若作りじゃないですよ?

システム運用って暇そうだなあ、そう考えていた時期が私にもありました。
しかし、それは最も理想的な形でありつつ、決して何もしていないわけではないというのが分かってきました。

運用者が忙しそうというのは、決して良いシステムではないのです。
定常的に行うような手作業が発生しているのは、それだけオペレーションミスの機会が多いということですし
「定型的な作業を自動化する」というシステム化そのものの目的を全う出来てない可能性もあるからです。

また、技術者のスキルという側面から見た場合、それは起こり得る障害に対して未然の防止が出来ていない可能性も高いのです。
(偉そうに言えるほど自分が出来ているわけでもないですが・・・)

とは言っても、全体をとても幅広く把握しつつ、且つその中で1つのミスを許されないなんて場合もあります。
物理面で言えば、サーバの機械部分、設置場所の温度などの環境、各種ケーブル類が抜けないようになっているかなど。
ソフト面では、OS・M/Wから開発されたアプリまで。それぞれが個々に不具合がないことと、組み合わせた場合にも
それぞれがかみ合わずに不具合にならないかなど、枚挙に暇がありません。
他にも外的要因としてセキュリティの甘さによるクラックとかとか。

一度全て想定しうる全てを書き起こそうとして、目次に当たる項目を列挙したことがあるのですが
項目だけで300行近くにまで達して断念したことがあります。
(仮に1システム用の運用資料として、1項目平均4ページとしたら1200ページに達する)
まあ、重複項目・不足項目がどれだけあるかは不明なため参考にすらならないかもしれませんが・・・。

これらを全ての対策を全て事前に施せば・・・と考えることはありますが
それをするほどの予算や時間があることはなく、またそんな想定を超えたことでシステムが止まることもあったりするのです。
聞いた話であればlsコマンドでサーバが停止したこともあるとのこと。(かなり特殊なケースだと思いますが)

大小様々なシステムが、社会インフラとして当然になりつつ・・・いや、もうなっているのかな。
それらの停止によるダメージは日に日に上がっていっているように思います。
しかし、それに対してシステムを止めずに動かし続けることを考えられる人が追いついていない、そんなことを感じます。

問題提起に留まってしまいますが、ほんの微力でもそれを改善できればなあ、と思い本エントリは書いてみました。

[姜子牙](*’-') < 「まだまだ勉強が足りないですねっ。」

はい、行ってきます。

姜子牙 その他, 未分類