質問: urldecode($test1 ); echo $test1; //実行結果・文字化け http://xn--cckea5a6cidcbh6ce7ghug17a2ge3aht3nwigef51658aw7kd.com/雑談/【デレステ】デレステ発�% ``` この文字化けしてしまうのを解決できないと MYSQLにてデータベースに保存する際に文字化けの部分でエラーが発生してしまい、 それ以降のアクセスの計測が出来なくなってしまい困っています。 試行錯誤を自分なりに頑張ってみたのですが上手くいきませんでした。 解決方法をご存知の方や 何かお気づきの点がございましたら お力をお貸し頂けると嬉しいです。 どうかよろしくお願いいたします。
回答: URLの末尾が「%E3%81%」となっていますが、少なくとも2バイト切れているようです。%E3 というデータから、これは UTF-8 の3バイト形式であることがわかります。それをURLエンコードすると 9バイトになるはずですが、7バイトしかありません。これが文字化けの原因です。本来は、もっと長いURLではないでしょうか? 失われたものを復元することは難しいので、「文字化けが起こらないようにデータを切り詰める」ことならできます。簡単なスクリプトを書いてみました。 ``` 0; $len--) { $decoded = urldecode(substr($str, 0, $len)); if (mb_check_encoding($decoded)) { return $decoded; } } return ""; } echo decode($test1); ``` 実行結果は以下となります。 ``` http://xn--cckea5a6cidcbh6ce7ghug17a2ge3aht3nwigef51658aw7kd.com/雑談/【デレステ】デレステ発%E ``` これを見ると、%E が残っています。文字化けが起きないという点ではよいのですが、データの正しさという点では %E も消したいところですが、それを防ぐにはURLエンコードとして正しいかどうかの判定も追加する必要があります。 まずはこれくらいで。