This test demonstrates that window.location.hash automatically performs URI decoding when read. The issue then is that setting a value and reading a value is not symetric. Also see comment at goog.History.prototype.getLocationFragment_.
The outcome is that goog.history.setToken/getToken should be the way to work with hash-based history (as it is symetric)