Every single layer has to agree upon what it's looking at from the input (JSON is always UTF-8) to the parsing to the writing to the DB to the fetching from the DB to the UI. So if the characters are being corrupted, it might be because your DB is actually expecting EUC-KR or something. In that case you might try encode("EUC-KR", $utf8_string); check your DB schema and see what it expects. But the problem might be in the UI uptake or output or your DB might be incorrectly configured/specified.
Update: didn't see your reply before I replied. I might look at this later but it's a lot to digest. :(