アクセス解析でサーチエンジンの検索語が、


\xc1\xeb\xb8\xc2

という感じにエンコードされています。おそらくUTF-8がデコードされるもので、PHP で iconv という関数を使えば戻せそうな感じなのですが、実際にはどのようなコードを書けば元に戻せるでしょうか。

良きアドバイスをお願いいたします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/10/10 11:44:47
  • 終了:2006/10/13 20:40:51

ベストアンサー

id:ito-yu No.2

ito-yu回答回数323ベストアンサー獲得回数142006/10/12 01:51:18

ポイント50pt

人力検索の基本に乗っ取って検索してみました。

http://www.factory.gr.jp/~ishigaki/works/

に到達し、

http://www.factory.gr.jp/~ishigaki/works/escuni2euc.php3.txt

を発見。php3となっていますが、php4でもphp5でも動くと思います。

上記のuni2utf8()を定義しておき、さっきのpreg_replaceみたいに使ってやればOK、だと思います。

%uXXXX形式にエンコードされた文字列のサンプルを提示してもらえたらテストできたんですが…

$str = '%uXXXX%uYYYY'; //ここに%u文字列
echo preg_replace('/%u[0-9a-fA-F]{4}/e', "uni2utf8('\\1')", $str);

//以下は引用です。
function uni2utf8($uniescape){
	$c = '';
	$n = intval(substr($uniescape, -4), 16);
	if($n < 0x7F){ //0000-007F
		$c .= chr($n);
	}elseif($n < 0x800){ //0080-0800
		$c .= chr(0xC0 | ($n / 64));
		$c .= chr(0x80 | ($n % 64));
	}else{ // 0800-FFFF
		$c .= chr(0xE0 | (($n / 64) / 64));
		$c .= chr(0x80 | (($n / 64) % 64));
		$c .= chr(0x80 | ($n % 64));
	}
	return $c;
}
id:ryuzi_kambe

回答ありがとうございます。残念ながら上手くいかなかったようです。

このページで出来ることと同じことが出来れば良かったようです。単に urldecode をかけるだけでは上手くいきませんでしたが・・・

http://ours.be/w/urlencode.php

いるか賞はさしあげますね。


(追記)こちらで正解でした。

http://www.kowa.org/modules/pukiwiki/93.html?easiestml_lang=en


「この%uXXXXという形式は、PHPのrawurldecodeとかでは対応出来ないようであり、また英数文字はそのまま出力されるので、扱いにくい文字列になっている。

このため、PHP-Stats PROもそのままでは、ページのタイトルや、検索文字列の日本語部部分は、%uXXXXという文字列の羅列で出力されてしまう。 」


とのことです。このページでは EUC に変換というところを utf-8 に修正し、上手く利用することが出来ました。基本に立ち返って検索するきっかけを与えてくださり、ありがとうございます。

2006/10/13 20:40:00

その他の回答(1件)

id:ito-yu No.1

ito-yu回答回数323ベストアンサー獲得回数142006/10/11 13:19:58

ポイント50pt

$str = '\\xc1\\xeb\\xb8\\xc2'; //ここにその文字列

echo preg_replace('/\\\\x([0-9a-fA-F][0-9a-fA-F])/e', "pack('c', hexdec('\\1'))", $str);

でどうでしょう。iconv使ってませんが

http://php.net/preg_replace

id:ryuzi_kambe

ありがとうございます。ばっちりでした。


Web を介してアプリケーションに値を渡す際には、サーバ側で stripslashes してあげる必要がありましたが、その他は万事問題有りませんでした。ちゃんとデコードされたときは、なんだかちょっと感動しました。


あと、 %uXXXX という形式のものもデコードしたいと思っています。もし2つめの回答でお答え下さったらポイント&いるか賞出させていただきますので、お時間ありましたらご回答いただけましたら幸いです。

2006/10/11 22:06:02
id:ito-yu No.2

ito-yu回答回数323ベストアンサー獲得回数142006/10/12 01:51:18ここでベストアンサー

ポイント50pt

人力検索の基本に乗っ取って検索してみました。

http://www.factory.gr.jp/~ishigaki/works/

に到達し、

http://www.factory.gr.jp/~ishigaki/works/escuni2euc.php3.txt

を発見。php3となっていますが、php4でもphp5でも動くと思います。

上記のuni2utf8()を定義しておき、さっきのpreg_replaceみたいに使ってやればOK、だと思います。

%uXXXX形式にエンコードされた文字列のサンプルを提示してもらえたらテストできたんですが…

$str = '%uXXXX%uYYYY'; //ここに%u文字列
echo preg_replace('/%u[0-9a-fA-F]{4}/e', "uni2utf8('\\1')", $str);

//以下は引用です。
function uni2utf8($uniescape){
	$c = '';
	$n = intval(substr($uniescape, -4), 16);
	if($n < 0x7F){ //0000-007F
		$c .= chr($n);
	}elseif($n < 0x800){ //0080-0800
		$c .= chr(0xC0 | ($n / 64));
		$c .= chr(0x80 | ($n % 64));
	}else{ // 0800-FFFF
		$c .= chr(0xE0 | (($n / 64) / 64));
		$c .= chr(0x80 | (($n / 64) % 64));
		$c .= chr(0x80 | ($n % 64));
	}
	return $c;
}
id:ryuzi_kambe

回答ありがとうございます。残念ながら上手くいかなかったようです。

このページで出来ることと同じことが出来れば良かったようです。単に urldecode をかけるだけでは上手くいきませんでしたが・・・

http://ours.be/w/urlencode.php

いるか賞はさしあげますね。


(追記)こちらで正解でした。

http://www.kowa.org/modules/pukiwiki/93.html?easiestml_lang=en


「この%uXXXXという形式は、PHPのrawurldecodeとかでは対応出来ないようであり、また英数文字はそのまま出力されるので、扱いにくい文字列になっている。

このため、PHP-Stats PROもそのままでは、ページのタイトルや、検索文字列の日本語部部分は、%uXXXXという文字列の羅列で出力されてしまう。 」


とのことです。このページでは EUC に変換というところを utf-8 に修正し、上手く利用することが出来ました。基本に立ち返って検索するきっかけを与えてくださり、ありがとうございます。

2006/10/13 20:40:00

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません