何をするのか
Ampacheは便利なのですが、そのままだと日本語のSJISのタグが付いたmp3などを突っ込むと文字化けしまくる。
WindowsはSJIS以外だとエクスプローラで文字化けするため、意識してないとSJISで管理しちゃうことが多い。
タグを別の文字コードに変換するのは面倒なため、Ampache側をいじることとする。
やり方
注意:かなり雑な方法なので、通常だと問題ない文字コードや特殊な文字などを処理したときに文字化けするかも。
確認環境
ubuntu 16.04 + nginx + php 7.0 + Ampache 3.8.3 (+ getID3 1.9.11)
「mb_detect_encoding」関数を使うので、php-mbstringパッケージをインストールして有効化
もう入っていれば飛ばして問題なし。
sudo apt-get install php7.0-mbstring
sudo systemctl restart php7.0-fpm.service
getID3にSJIS判定を追加
以下のファイルを編集する
– (ampacheインストールディレクトリ)/lib/vendor/james-heinrich/getid3/getid3/getid3.lib.php
この部分のすぐ後に
public static function iconv_fallback($in_charset, $out_charset, $string) {
if ($in_charset == $out_charset) {
return $string;
}
以下を追加する
if( mb_detect_encoding($string,"SJIS-win",true) ){
return mb_convert_encoding($string,$out_charset,"SJIS-win");
}
対応方法についてのメモ
何か問題が起こったときに確認するためのメモ。
getID3について
以下で公開されてる。
https://github.com/JamesHeinrich/getID3
Ampacheではこれを使ってmp3などのタグを処理してるのですが、getID3は本記事時点で最新のv1.9.13でもSJISに対応していない。
とはいえプルリクエストしてどうにかなるものではなさそう。
文字コードに何を使っているのか文字列から判定する必要があるのですが、その対応がとても難しいです。
少なくともPHPの関数だけでは世界中の文字コードを間違いなく判定することはできないと思われる。
なので、対応する文字列を無難な中から取捨選択するしかなさそう。
そもそもSJISなんて使ってるMicrosoftが諸悪の根源に違いない。
getID3に追記した内容について
文字列の判定と変換を、通常では以下の順番でやってる。
- [変換前文字コード=変換後文字コード]の場合
- …もろもろそれ以外の場合
それをこうする
- [変換前文字コード=変換後文字コード]の場合
- [変換前文字コード=SJIS]の場合 <= 追加
- …もろもろそれ以外の場合
コメント