PHP 5.3.0 より前のバージョンでは、rawurlencode はチルダ (~) もエンコードしていました。これは ≫ RFC 1738 で定められた方法です。
<?php print str_replace( '%7E', '~', rawurlencode("a b 日本語") ) ?>
と言うか、php 5.2.x と 5.3.x で rawurlencode の動作が違うようです。上記は、5.2.x 用で、5.3.x では必要無いみたいです 関連する記事 VBScript : URLEncode( OAuth 用 rfc3986 ) PHP / JavaScript / ASP / PowerShell / python / Framework(バージョン別) : 処理別の urlencode の結果の違い