※ ChatGPTを利用し、要約された質問です(原文:String <=> byte配列 の際のエンコード(続))
String <=> byte配列 の際のエンコード(続)
このQ&Aのポイント
Stringのエンコードに関する勘違いについて質問があります。
サーブレットでの日本語リクエストパラメータのエンコーディングについて誤解があった。
request.getParameter("test")の結果はブラウザのエンコーディングでバイト列を用い、値はそのままでエンコード名だけが指定されたものとなる。
String <=> byte配列 の際のエンコード(続)
前回の質問(4つほど前の)の続きですが、
8859-1が日本語を扱うことができるという勘違いは、
サーブレットで日本語のリクエストパラメータを使用する際の、
次のようなコードに起因してます。
String param =
new String(request.getParameter("test")).getBytes("8859_1"),
"JISAutoDetect");
ここで、request.getParameter("test") から返ってくる String は
8859-1エンコーディングされたものだと単純に考えていたのですが、
今回、あらためてこれについて考えてみました。
request.getParameter("test").getBytes("8859_1") で、
ブラウザのエンコーディングを用いた、パラメータを表現するバイト列が
ちゃんと取得できています。
では、request.getParameter("test") の結果返ってくる String は
ブラウザのエンコードでパラメータを表現するバイト列を用い、
値はそのままで、エンコード名だけを8859-1として構築されたもの、
になると思うのですが、
そういう認識で正しいのでしょうか。
また、それで正しいのなら、それと同じことを自分で行うには
どうすればよいのでしょうか。
とても気になります。
もしわかる方がいらっしゃったら、是非回答お願いします。
お礼
おはようございます。URL見ました。 >Harryさんの元のご質問は、こういう状態になっているかどうかを >確認したかったのではないでしょうか。 「確認」という言葉を使えるほど、 こういう状態であることを予測してませんでした。 String型が8859-1も内部的な文字表現手段として利用してるのではないか、 という方向にばかり考えが向いていたので・・・ そうではなく、そもそも8859-1がUnicodeのサブセットのようなコード構成 になっていたのですね。 あるバイト列を8859-1エンコードで解釈した結果、「?」と表示されてしまう 未定義(と思っていた)部分は、それがUnicodeのコードに変換されるときに、 すべて、同一のコードにマッピングされて、復元不可能になってしまうのでは ないか、 という疑問があったのですが、これも、これらが未定義ではなく制御文字、 しかもやはり1対1対応、ということで氷解しました。 とてもすっきりしました。 本当にどうもありがとうございます。 ところで、URLの完全一対一の対応表を見て、 ちょっとこれらの文字コードの成り立ちに興味が湧いてきました。 この辺もうすこし自分で調べてみようと思います。