鱒身(Masu_mi)のブログ

知った事をメモする場所。

PHPのparse_urlは勝手にエンコード変換する

PHPはRFC定義に従う基礎的な関数が提供されていない。 しかたないのでURIを定義している RFC3986 に従って実装する。

PHPの parse_url() は勝手に文字コードを変換する。しかも自力で文字コードを判別する。 そのほか不完全なURLでも色々と頑張ってしまう。 そのためマルチバイト文字列が含まれるURLの場合は文字化けが起きてしまう。

<?php namespace Masumi\Plain

fuction parse_uri($uri)
{
  $uri_reg_exp = '(^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?)';

  preg_match($uri_reg_exp, $uri, $matches);
  return array(
      'scheme'    => empty($matches[2])?NULL:$matches[2],
      'authority' => empty($matches[4])?NULL:$matches[4],
      'path'      => $matches[5],
      'query'     => empty($matches[7])?NULL:$matches[7],
      'fragment'  => empty($matches[9])?NULL:$matches[9]
  );
}

user/passには対応していないけどRFC3986を素直にサポートした。 なんでPHPは第一義の(定義の存在する)機能が隠されているんだ。。

PSRの命名規則は大御所向け?

PSR 詳しくないのだけど PSR-0 によると名前空間の第一階層はベンダ名になっている。 FIG メンバーの様に大御所は問題ないけど 野良を個人で公開する時には、どうしたらいいんだろう。 Javaみたいにドメイン逆向きとか許して貰えるなら嬉しいな。

文字コード変換周りで出てきた事

  • php_build_query() はクエリを作成する際に勝手にエンコードする

    URLエンコードした文字列が値に含まれていると多重エンコードになる

  • JavaScriptでURLエンコードするときUTF-8 しか標準は存在しない

  • URLエスケープされた文字列が本文のエンコードが一致しないと文字化けする