mb_convert_encoding
PHP の話なんですけどね。
$result = mb_convert_encoding( $string, "euc-jp", "auto" );
みたいな事をよくやる訳ですよ。
そこで問題が。
$string が EUC の "連邦" とか EUC の "腹" とかだった場合。
エンコーディングの自動検出に失敗する訳ですよ。
・・・っていきなりでっかい人から電話かかってきて白木屋に行くことになったので続きは帰ってから書くよ!
帰ってきたよ!朝の5時だよ!
白木屋はトリュフチョコのアイスクリームが 99 円と安くておいしいのでオススメ!
「しらきや」じゃなくて「しろきや」って読むらしいよ!
はい。と言うわけでね。
$string が EUC の "連邦" だった場合。UTF-8 だと勘違いするようです。
mb_detect_encoding() で確認してみました。
ソース
echo "あいうえお : " . mb_detect_encoding( "あいうえお" ) . "<br />\n";
echo "連邦 : " . mb_detect_encoding( "連邦" ) . "<br />\n";
echo "腹 : " . mb_detect_encoding( "腹" ) . "<br />\n";
結果
あいうえお : EUC-JP
連邦 : UTF-8
腹 : UTF-8
勘違いしてますねー。
さて、これを解決するためにはどうしたらいいか。と。
場合によるっちゅうねん。
僕の場合、 get_title() っていう関数を作ってて
引数に URL を渡すとそのページのタイトルを返すっていう関数なんですけどね。
ソース
echo get_title( "http://yahoo.co.jp/" );
結果
Yahoo! JAPAN
こんな感じに使う訳ですよ。
この場合 get_title() の中で取得したタイトルを EUC に変換しようとすると・・・
ソース
function get_title( $url )
{
// URL で指定されたページの HTML 文字列を取得する
$page = open_page( $url );// HTML の中から
に囲まれたタイトルを取得する
$title = get_title_in_page( $page );// タイトルを EUC に変換する ( 元のエンコーディングは分からない )
// $title が "連邦" だった場合間違って変換されちゃうよ!
$title = mb_convert_encoding( $title, "euc-jp", "auto" );
}
ということになってしまう訳です。
そこで。最後の部分をこんな風に変更します。
ソース
$title = mb_convert_encoding( $title, "euc-jp", mb_detect_encoding( $page ) );
エンコーディングの自動検出をタイトルからだけするんじゃなくて。
ページの HTML 全体から検出することによって、より結果が確実になる。という訳なんですよ。
もっといい方法があるかもしれないですが、今回はこんな風に対策してみました。
掲示板なんかで POST された文字列を変換する場合はまた方法が違ってきますね。
このへんも参考に。
BugTrack/296 - PukiWiki
PHP 4.2.3
カテゴリ
developmentトラックバック(0)
このブログ記事を参照しているブログ一覧: mb_convert_encoding
このブログ記事に対するトラックバックURL: http://je-pu-pu.jp/blog/mt-tb.cgi/68

コメントする