Yahoo!Pipesの文字化け対策

229 views

ここのサイトで対策用のPHPを作成配布してくれてます。感謝です。PHPは以下のとおり。

load-as-x-charset.php

<?php
// 雀の往来
if( !(isset($_GET['url']) && isset($_GET['s']) && isset($_GET['d'])) ) {
	about();
	exit();
}

$source_charset = $_GET['s'];
$source_charset_php = get_phpcharset($source_charset);
$dest_charset = $_GET['d'];
$dest_charset_php   = get_phpcharset($dest_charset);
$contents = file_get_contents($_GET['url']);

$contents = mb_convert_encoding( $contents, $dest_charset_php, $source_charset_php );

$pattern = '/('SJIS-win',
		'euc-jp'=>'eucJP-win',
		'utf-8'=>'UTF-8',
	);
	if( isset($table[$key]) ) {
		return $table[$key];
	} else {
		return $name;
	}
}



function about()
{
	$html = <<<_EOT_
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>文字コードを指定してHTMLを読み込みますよ(^o^)丿</h1>
<form method='GET'>
<p>読込元の文字コード:
<select name='s'>
<option value='UTF-8'>UTF-8</option>
<option value='Shift_JIS' selected>Shift_JIS</option>
<option value='EUC-JP'>EUC-JP</option>
</select>
</p>
<p>変換後の文字コード:
<select name='d'>
<option value='UTF-8' selected>UTF-8</option>
<option value='Shift_JIS'>Shift_JIS</option>
<option value='EUC-JP'>EUC-JP</option>
</select>
</p>
<p>取得するURL:<input type='text' name='url' value='http://www.aso-taro.jp/diary/index.html' size='60'></p>
<p><input type='submit'></p>
</form>
</body>
</html>
_EOT_;
	echo $html;
}


class PathReplace
{
    static public function toAbsolutePath( $baseurl, $html )
    {
        return preg_replace('/(href|src)s*=s*("[^\"]*"|'[^\']*')/e', 'self::expand_links("$baseurl","$1","$2")', $html);
    }
    
    static private function expand_links($baseurl, $elem, $link) {
        $link = trim($link, ''"');
        if( preg_match( '/^[w]{2,8}:///i', $link ) ) {
            $top = '';
        } else {
            $top = self::is_root_reference($link)
                 ? self::rootname($baseurl)
                 : ( self::str_right($baseurl,1)=='/' ? $baseurl : dirname($baseurl).'/' );
        }
        return("{$elem}="{$top}{$link}"");
    }
    
    // リンクがルートパスへの参照をしているか調べる
    static private function is_root_reference($link)
    {
        return (self::str_left($link,1) == '/');
    }
    // URLのドメイン名までの部分を取得
    static private function rootname($url)
    {
        return preg_match('/^([a-z]{2,10}://[^/]+)/i', $url, $r) ? $r[1] : '';
    }
    // 文字列を右側から指定数切り取って返す。ExcelのRIGHT関数と同様。
    static private function str_right( $string, $n )
    {
        return substr($string, strlen($string) -$n, $n);
    }
    // 文字列を左側から指定数切り取って返す。ExcelのLEFT関数と同様。
    static private function str_left( $string, $n )
    {
        return substr($string, 0, $n);
    }
}