かな漢字のタイトルが表示されない
いまさらながら podcast しようとして mp3 ファイルをつくりました。
id3tagで タイトルなどを入力して ファイルを WEBサーバに転送しました。
podcast用のツールの DirCaster を インストールして 設定し、ブラウザで feedのURLへアクセスしたら タイトルが !? とかに なって せっかく 設定した文字が 表示されない。
DirCasterを解析してみる
ソースを よんでみると ID3タグが lib_getid3を つかっていて データがとりだせているのは echo を はさんで みて りかいできた。
読み出したtitleなどの情報を stripJunk()
という 関数で 文字を すててるのがわかりました。asciiの国の人は 7bitの 世界でいいかもしれないけど かな漢字をつかう私は それでは だめなので まずは この関数を呼ばないことにしました。
ID3のバージョンによって ファイルに 記録されている文字コードが UTF-16だったりUTF-8だったりするので いつもの mb_convert_encoding()
をつかって UTF-8 に変換します。
$this->title = mb_convert_encoding($tit, "UTF-8", "auto");
この部分を修正しても まだ ä»�æ�¥ã
な 出力になっていたのでほかにも なにか変換してるだろうとと探したところ
title = htmlentities( $title );
と HTMLエンティティに 変換してるところを発見 かな漢字で この関数を つかってはいけないので 必要最低限の変換を行うhtmlspecialchars()
に修正しました。 ( mb_encode_numericentity() を使うほうが 良い可能性はありますが・・・出力の可読性重視で htmlspecialcharsにしました。)
そうしたところ ようやく期待通りに タイトルが 出力されるようになりました。
FEEDがただしいかチェック
feedvalidatorで チェックしたところ サーバの報告とXMLの内容が 不一致になってると 指摘されたので ヘッダ出力を修正して キャラコードを UTF-8 と宣言しました。
header('Content-type: text/xml; charset=UTF-8', true);
めでたしめでたし
追記(20170726)
ファイル名が 仮名漢字だと うまくいかないようです。
追記(2017/9/4)
PHPのバージョンによって htmlentitiesの エンコードパラメータの defaultが ちがうようで それが原因でした。
htmlentities($a)
と なっているところを htmlentities($a,ENT_COMPAT,"UTF-8")
に変更しました。
追記(2017/9/12)
うまく ダウンロードできない ファイルが 存在したので URLの作り方を 再考察して
$url = $rootMP3URL."/". str_replace("%2F", "/",rawurlencode($filename));
と rawencode して / を 元に戻すようにしました。