対向システムとの文字コードが違う場合の文字化け対応

厳密にJavaの話ではないけど、Javaにカテゴライズします。
以下のようなWebのシステムがあるとします。

自システムはユーザによってブラウザで入力された文字列を取得して、
その文字列をサーバAに引き渡します。

サーバAは受け取った文字列を自システムに返却。
自システムもまた、サーバAから受け取った文字列をブラウザに返却し、
ブラウザで文字を出力します。

ここで、ブラウザと自システムの間はUTF-8で文字列のやり取りをし、
自システムとサーバAとの間はSJISでやりとりすることとします。

こんなシステムなんてあるわけないですが、簡略化のため、上記の前提でいきます。


自システムは、HTTPヘッダを作ると共に、
ブラウザより受け取った文字列をSJIS(Windows-31J)でURLエンコードしてボディにセット、POSTでサーバAに送信します。
更にサーバAからHTTPレスポンスを受け取り、戻ってきた文字列を抜き出して、UTF-8にしてからブラウザに返却します。


ここで、SJISにコードがない「㒵」のような文字がブラウザから送られてきた場合を考えます。

自システムはUTF-8なので、自システムに渡ってきた時には「㒵」は理解できます。
しかし、これをサーバAに渡す時が問題で、Windows-31JでURLエンコードしてしまうと、
マッピングする文字コードがないため、化けてしまい、「%3F」になってしまいます。

「%3F」は「?」ですね。

サーバAに「?」を送ってしまったもんで、サーバAからは当然「?」が戻ってきます。
もちろんブラウザに返却する文字列も「?」です。

これを回避するため、URLエンコード前に送信する文字を1文字1文字チェックするようにしました。
やり方は、文字列を1文字ずつString#charAtでchar型で抜き出し、それぞれに対してURLエンコードをかけ、
URLエンコード結果が「%3F」であれば、その文字列をint型に変換、
更にint型にしたものを「&#」「;」で挟み込むような文字列操作を実装しました。

「㒵」の場合はURLエンコードをかけると「%3F」になるので、int型にキャストすると、「13493」となります。
それを「&#」「;」で挟み、「㒵」(←ほんとは半角ですが、半角だと正しく「㒵」が表示されてしまうので、読み替えてください。)とします。

文字列を走査し、同様の操作をかけて文字列に細工したものに対してURLエンコードをかけてサーバAに送ると・・・・
うまくいきました。


うまくいったのはいいのだけど・・・・ほんとにこんな文字列操作を行わないといけないのか!?
もっと楽な方法あるんじゃないか??
と思ってるのですが、どうなんでしょう。