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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?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エスケープされた文字列が本文のエンコードが一致しないと文字化けする

ref.

comments powered by Disqus