Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

文字のエンコードについて

サーブレットにて、クライアントからフォーム情報の
文字列が送られたとき、そのバイト数をチェックして
います。しかし、クライアントからフォーム情報に、
文字"〜"が送信されてきた場合、下記の?だと正しく
2バイトとして扱われません。?だと正常に2バイト
として扱われる為、バイト数チェックが成功します。
両者の違いは何なのでしょうか?

?str.getBytes("SJIS").length
?str.getBytes("Windows-31J").length

4

回答

8337

閲覧

4件の回答

評価

0

簡単に言えば、Windows-31JはShift-JISのMicrosoft版です。
Javaでは両者の変換部は、別物として実装されています。
現時点ではSJISのコンバータは、いろいろ不都合があるようです。

"Windows-31J SJIS 違い"

とかそんな語で検索すると、いろいろ情報が得られるでしょう。

評価

0

早速の回答ありがとうございます。
すいません、質問が誤っていました。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サーバだとこの事象となります。

評価

0

あ…質問をよく読んでませんでした…。

?は、「〜」の右側が上がっている字形ですね。納得しました。

SJISとWindows-31Jでどちらの文字を扱うか(Unicode/EUCとのマッピング)が違うから、ということでしょうか。
Windows-31Jであれば、ふだん使っている〜(左側が上がっている)が使われると思うんですが。

評価

0

とりあえずgetByteメソッドの引数に"SJIS"でなく、
"Windows-31J"を指定することで"〜"あるいは"−"を
全角2バイトとして扱ってくれることをログにて確認
しました。
文字化けした文字はどんな文字に化けても"SJIS"と
指定してしまうと1バイトとして扱ってしまうよう
です。ありがとうございましたm_ _m

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。