質問: サーブレットにて、クライアントからフォーム情報の 文字列が送られたとき、そのバイト数をチェックして います。しかし、クライアントからフォーム情報に、 文字"〜"が送信されてきた場合、下記の?だと正しく 2バイトとして扱われません。?だと正常に2バイト として扱われる為、バイト数チェックが成功します。 両者の違いは何なのでしょうか? ?str.getBytes("SJIS").length ?str.getBytes("Windows-31J").length
回答: 早速の回答ありがとうございます。 すいません、質問が誤っていました。getBytesメソッドの エンコーディングに"SJIS"を指定すると"〜"はなぜ2バイト として扱われないのか、また"Windows-31J"だとなぜ2バイト として扱われるのかということを教えていただきたいです。 まず、Windows-31Jが機種依存文字であることとバイト数に 関して言えば、SJISと違いはないことはわかりました。 (ただ"〜"などの特殊文字に関しては例外らしいですね..) サーバ側ではバイト数チェック時にすでに文字化けして しまっていると思われます。 実際、エンコードに"SJIS"を指定するとバイト数チェック が行われないのでその後のDB更新処理に移り、そこで 落ちてます。ログのSQL文には"〜"は"潤オ"になってます。 また、Mainクラスで試しに"〜"と"潤オ"の2パターンで getBytes(文字コード).length でテストしてみましたが"〜"は2バイト、"潤オ"は 3バイトになってました。実際のバイト処理中には "〜"が"?"とかになって1バイトとして判断されて るんでしょうか..? ※ついでにJSP側でのcontentTypeはUTF-8です。 Windowsサーバなら"SJIS"でもうまくいくんですが、 UNIXサーバだとこの事象となります。