異邦人になってみた~~上海生活写真ブログ

中国上海市在住です。もう10年を超えました。休日は星空(天の川)撮影やポートレート撮影等、連休時はカメラを持って中国各地を旅行してます。最近は内モンゴル自治区によく行っています。

 このブログについて(about)
  中国旅行/観光/写真記事一覧(省別)

PHPで数値文字参照をUTF-8に変換

はてなダイアリーに書いた日本語に無い中国語漢字は全て数値文字参照
に変換されてしまいます。

WordPressに移行しようと思い、調査のため
Movable Type形式でデータをエクスポートしたはいいが、数値文字参照のままでは。。。
意味がないのでこの部分を変換してみました。
言語は何でもよかったのですが、丁度手元にあったPHP環境で書きました。
変換の関数ですが、どれを使ったらいいのか分からなくて
mb_convert_encoding($str ,'UTF-8','HTML-ENTITIES');

$convmap = array ( 0x0000, 0xffff, 0x0000, 0xffff );
mb_decode_numericentity ( $str, $convmap, 'UTF-8' );
いろいろ試行錯誤しましたが上記では一部の中国語が変換されなかったりしたので
(おそらく16進数が入っている数値文字参照が変換されない)
結局html_entity_decodeこれでいけるみたいです。


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
数値<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%B8%BB%FA%BB%B2%BE%C8">文字参照</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/UTF-8">UTF-8</a>に変換
</head>
<body>
<?php

//変換メソッド
function entity_to_utf($str){
return html_entity_decode($str, ENT_QUOTES, 'UTF-8');
}

//正規表現で&#(.*?);形式のものだけを変換う
//<等のHTMLタグはひっかけないようにする。
//function convert_sutimojisanshou($intext){
// $text = $intext;
// $buffer="";
// //数値文字参照を見つける
// preg_match_all("/&#(.*?);/is", $text, $contentmatches);
// if(isset($contentmatches[0][0])){
// $intMaxCount = count($contentmatches[0]);
// for($j = 0; $j < $intMaxCount; $j++){
// $buffer = $contentmatches[0][$j];
// $str_char = entity_to_utf($buffer);
// if("" != $str_char){
// $intext = str_replace($buffer,$str_char, $intext);
// }
// }
// }
// return $intext;
//}

//UTF-8を数値文字参照に変換

//実行時間の調整
set_time_limit(3000);
//ファイルの読み込み
$fpr = fopen('hatena.txt', 'r');
//ファイルの書き込み
$fpw = fopen('writefilename.txt', 'w');

if ($fpr){
while ($buffer = fgets($fpr)){
fwrite($fpw,entity_to_utf($buffer));
}
}

fclose($fpr);
fclose($fpw);

?>
</body>
</html>

コメントにしてありますが、タグを変換したくない場合は対象の文字だけを
抜き出す必要があるかもです。
まあ今回は試しただけですが、もしかしたら移行するかもしれません。