PHP の urlencode() でも htmlentities() でも正しくエンコードされていない文字がいくつかあります。それらは最初のセットには含まれていなかったと思います。
たとえば、http://youtu.be/2MfXW_lUZOc のようなものは、「http%3A%2F%2Fyoutu.be%2F2MfXW lUZOc」としてエンコードされます (アンダースコアが空白に置き換えられていることに注意してください)。
encodeURIComponent() JavaScript 関数に似たものを探しています。何か案が?