These issues are symptomatic of a few possible problems. Mostly nothing to do with Ruby.
1) Your form gets sent with an Accept-Charset different from UTF-8. This will happen if
- the page the form gets sent from is itself not UTF-8, by meta tag or HTTP header (a form from a Latin-1 page will be Latin-1)
- The form explicitly specifies that it is sent as something other than UTF-8
- You are using Javascript to post the data and not escaping correctly, or your users do
In this case the browser might be downgrading Unicode to the charset it can send. In general, the assumed accept-charset of the form is the charset of the page that displays the form in the first place.
2) Your MySQL server is configured in a manner that proactively obstructs you from using UTF-8 for data storage, so MySQL silently downgrades your UTF to something else (say MySQL is forced to do SET NAMES SOME_CRAPPY_8BIT_CHARSET_OF_1990 on every connection, by the server admin. No joke - this happened to me once). Read this article which explains how to hardwire everything for UTF-8 with 100% certainity
http://www.fngtps.com/2007/02/ruby-and-mysql-encoding-flakiness
3) Your terminal that you are looking at is not showing you UTF-8 and tries to recode it into Latin or ASCII, dropping characters it cannot display and replacing them with "?" (standard pattern). If you do "puts 'ü'" in plain Ruby with $KCODE set what do you see?
Windows terminals are especially susceptible to this kind of behavior before special settings are in place.
4) You are running Ruby 1.9 whose handling of Unicode is a special matter altogether
5) Totally unlikely but who knows: you are using (or your hoster is using) some crappy proxy solution which mangles your charset headers or recodes the input being sent.
I can bet on 2 and 3 with about 50% chance.