Forms can be submitted using one of two methods. The default is GET.
1. GET
Here form values go on the URL and non-ASCII characters are escaped by the browser. The escaping is where the character is converted to a sequence of bytes according to some encoding and then the bytes are converted to hex. So for each non-ASCII character, you'll end up with %xy. (See java.net.URLEncoder's javadoc.) The recommended encoding to get the bytes is for the URL is UTF-8 but Firefox (and maybe others) encodes according to the response content-type meta tag.
So how does Tomcat know how to interpret the %xy's in the URL? It knows because of a setting in server.xml.
<Connector port="8080" URIEncoding="UTF-8"/>
2. POST
Here form values go in body of response. Again, Firefox encodes according to the response content-type meta tag. So how does the server know what the encoding is? Well, if we assume that the form post is coming in the same way the form response went out, then we have the answer. To tell Tomcat how to interpret the body, you'll need to set the character encoding on the incoming request.
request.setCharacterEncoding("UTF-8");
This is done in the SetCharacterEncodingFilter mentioned earlier.
It turns out that this bug could have been solved all along with the Tomcat URIEncoding setting.