異邦人になってみた~上海の人 

読者です 読者をやめる 読者になる 読者になる

異邦人になってみた~上海の人 

上海在住です。中国時代劇をよく見ています、中国旅行の事、weiboやQQの設定、一眼レフカメラの写真掲載、上海での日々の生活情報を書いています

 記事一覧表示
スポンサーリンク

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

PHP

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

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>

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