Home > Archives > 2009-08
2009-08
SimplePieでEUC-JPのフィードを読み込むと化ける
- 2009-08-14 (金)
- 技術
たくさんのRSS/ATOMを解析ーなんてのは、PHPでWebアプリとか作ってると良くある事なのですが、そんなときに便利なのがBSDライセンスで商用利用もOKなFeedパーサ「SimplePie」
大変便利なのですが、なぜかEUC-JPだと文字化けしてしまいました。
どうやらEUC-JPをLatin-1だと思い込んでご丁寧に内部エンコードに変換してくださっているようです。せめてそのままなら扱いやすいのに…これだとmb_detect_encodingしてもUTF-8だと誤解される模様。
試行錯誤の末得た結論は、utf8→Latin1変換の後、文字コード判別の後EUC-JP(等)→utf8変換を行う、というもの。全く持って酷い方法ですが……上手くは行きました。
ソースはこんな感じ。
function mb_convert_utf8($input){
if(is_array($input)){
foreach($input as $key=>$value){
$output[$key] = mb_convert_utf8($value);
}
return $output;
}else{
if(mb_detect_encoding(utf8_decode($input))=='ASCII'){
return $input;
}else{
return mb_convert_encoding(utf8_decode($input) ,"UTF-8", "ASCII,JIS,EUC-JP,SJIS");
}
}
}
※ 僕の書いていたプログラムの都合上、再帰で配列に対応しました。オブジェクトとか渡すとバグると思います。こだわる人は書き足せば良いんじゃないかな。
※ ライセンス?このソースに関しては好きな様にお使いください。権利を行使とかは特にしませんので。
- Comments: 0
- Trackbacks: 0
Wordpressのウィジェットを複数にしたテーマ作成について(の正しい情報)
- 2009-08-12 (水)
- 技術
あちこちのブログで間違った事ばかり書いているので混乱させられましたが、結局こうすれば良いと言うのが分かったのでメモ。
トラバ先で大体合ってるんだけど、register_sidebars関数の第一引数についての説明が誤っています。「widget番号」ではなく「widgetの個数」です。なので管理画面に一個多く出てきてしまうんですよね。
・functions.php
if ( function_exists('register_sidebars') ) {
register_sidebars(2,array(
'before_widget' => '<div class="widget">',
'after_widget' => '</div>',
'before_title' => '<h2 class="header">',
'after_title' => '</h2>',
));
}
・sidebar.php(index.phpでも良い)
<?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar(1) ) : ?>
<?php endif; ?>
および
<?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar(2) ) : ?>
<?php endif; ?>
if (
function_exists('register_sidebars') ) {
register_sidebars(2,array(
'before_widget' => '<div>',
'after_widget' => '</div>',
'before_title' => '<h2>',
'after_title' => '</h2>',
));
こんな感じです。register_sidebars(2)だとかregister_sidebars関数を二回呼び出してるのとかありますが、違います。
ただし、2つのサイドバーで別々の体裁にしたい場合や名前をきちんとつけたい場合は、register_sidebars関数の第一引数を1にしたのを2回呼ぶのが適当です。その場合のソースはこんな感じ。
if ( function_exists('register_sidebars') ) {
register_sidebars(1,array(
'name' => '左サイドバー' ,
'before_widget' => '<div class="widget1">',
'after_widget' => '</div>',
'before_title' => '<h2 class="header">',
'after_title' => '</h2>',
));
register_sidebars(1,array(
'name' => '右サイドバー' ,
'before_widget' => '<div class="widget2">',
'after_widget' => '</div>',
'before_title' => '<h2 class="header">',
'after_title' => '</h2>',
));
}
名前がきちんと出ない時は、functions.phpの文字コードとか確認してみると良いです。
また、3つとか4つとか使う時はregister_sidebars関数の第一引数の数字の合計が使えるウィジェットの数を合わせます。全部同じHTMLで、そのテーマを自分で使うならregister_sidebars(4,…..)と呼び出せば良いですし、配布目的など名前をきちんとつけたいならregister_sidebars(1,array(’name’=>’HOGE’……..))を4回呼び出せば良いでしょう。
http://codex.wordpress.org/WordPress_Widgets_Api/register_sidebars にリファレンスもあるので見ると良いと思います。
- Comments: 0
- Trackbacks: 2
Home > Archives > 2009-08
- Search
- Feeds
- Meta