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

カテゴリ

トラックバック(0)

このブログ記事を参照しているブログ一覧: mb_convert_encoding

このブログ記事に対するトラックバックURL: http://je-pu-pu.jp/blog/mt-tb.cgi/68

コメントする

このブログ記事について

このページは、が2004年11月 6日 00:20に書いたブログ記事です。

ひとつ前のブログ記事は「蒼昊ノ恋歌」です。

次のブログ記事は「VBS_REDLOF.A」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.0