JSPに文字コードを指定しているにも関わらず、
「Java側でUTF-8の文字コードを指定してあげなければ、画面遷移した画面遷移先で文字化けが起こってしまう。」という状況なのですが、これの解決方法は無いものでしょうか?
【文字エンコード状況】
●JSP
JSP側では、画面遷移元、画面遷移先の両方とも 文字コード「UTF-8で指定」しています。
<% page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
●Java
Java側では、
response.setContentType("text/html; charset=UTF-8");//コンテンツタイプ
request.setCharacterEncoding("UTF-8"); //コード変換
という2点をコード変換として記述しています。
【値受け渡し状況(画面表示状況)】
●1 画面遷移元 画面1(JSP)
<input type="text" value="あいうえお" name="name1">
●2 java(servlet) → 画面1のname1の“あいうえお”を受取る
String strName = new String(request.getParamete("name1"));
request.setAttribute("name", strName);
●3 画面遷移先 画面2(JSP) → “あいうえお”を表示
<%= (String)request.getAttribute("name1") %>
画面状況:文字化けしている。[ォ・・サウ」(といった感じです)
●現状の解決方法
ここで、文字化けの解決方法として、
画面1のリクエストをゲットする際に、
java(servlet)での、文字の受け取り方の記述を変更しました。
String strName = new String(request.getParamete("name1"));
から
String struserName = new String(request.getParamete("name").getBytes("ISO-8859-1"),"UTF-8");
という風に「 .getBytes("ISO-8859-1"),"UTF-8") 」 を付与してやることで、回避でききました。が、これで解決策としては妥当でしょうか?(正しいでしょうか?)
気にかかっているところが、どうもこのやり方が強引に文字を変換しているようにしか思えませんでして(実際のところは正しいのかもしれませんが・・・)このまま値を渡してやっていいのか判別が付かずに困っています。
この方法でも大丈夫でしょうか?
特別、何か問題というのはありませんでしょうか?
No.4ベストアンサー
- 回答日時:
>「これで正しいUTF-16の状態」というのは、
>ここの「 new String( bytes, "UTF-8");」で
>バイト変換した場合、"UTF-8"に文字コードセットされたデータを、
>Javaが"UTF-16"として処理出来る状態になった、ということでしょうか?
「JavaがUTF-16として処理できるようになった」のではなくて、
「UTF-8の文字が、UTF-16の文字に正しくマッピングされて、「あ」が「あ」として扱われるようになった」です。
Javaでは元の文字コードが何であろうと、文字のバイトの並びがなんであろうと、Stringは常にそのバイトの並びを、UTF-16として処理するので。
以下は変な例ですが、
正しくマッピングがされている状態とは、
元のバイトの並びがutf-8で、「0xa1、0x00」、文字としては2文字の「A、null」を意味していたときに、UTF-16でも2文字の「A、null」であるということです。
正しくないとは、これが、1文字の「A」としてだけ認識されるような状態です。
本当に変な例なので、あくまでも例として考えてください。
要するには意味が異なってしまった状態のことです。
後、2-1と、2-2は一連の流れで1セットです。紛らわしかったです。
bytes = requestParameter.getBytes("iso-8859-1");
requestParameter = new String( bytes, "UTF-8");
ありがとうございます。
たびたびすみません(--;
「 UTF-8の文字が、UTF-16の文字に正しくマッピングされて、「あ」が「あ」として扱われるようになった 」
本当に変な例としては
utf-8の文字をutf-16にしたとき
「A、null」が「A、null」でなく「A」とだけ認識ということがあるのですね。
そこのところ不思議におもっていたところで
「utf-8なのにutf-16にして何か問題ないのだろうか」と想っていたところだったんです。
内部的な動きというものをよくわかっていないのでイメージではありますが、javaが上手いこと内部的に処理してくれてそうですね。
なんだか長い事すみません(--;
ご回答いただいた内容とても参考になりました。
No.3
- 回答日時:
>調べてみたらこれってASCIIコードのことだったのですね。
そです。
大抵のエンコーディングは、asciiと互換性を持たせる符号化方式をとっています。
>utf-8(最初の画面) → iso-8859-1(コンテナ通過時) → UTF16(java通過時に自動変換する) → UTF-8(javaの中で getBytes("ISO-8859-1"),"UTF-8"); として設定) → utf-8(次の画面)
>
>という流れで、
>正常に文字化けなく表示される「“あ”が表示される」、となる、ということでしょうか?
や、こんな感じだと思います。
1.HTML(UTF-8)
↓(ブラウザからコンテナが受け取るまでずっとUTF-8のバイト値)
2. Java
1) コンテナ or フィルタ
リクエストのバイト値をiso8859-1としてJava内部コードに変換
requestParameter = new String(bytes, "iso-8859-1");
この時点でUTF-16になっているけれども、化け状態
2) サーブレット
間違えた変換がされているので、
2-1) 戻す
bytes = requestParameter.getBytes("iso-8859-1");
2-2) 正しく変換
requestParameter = new String( bytes, "UTF-8");
これで正しいUTF-16の状態
3) JSP
JSPにかかれたものは、実行時UTF-16になる(Javaコードになるから)。ソースがShift_JISで書いてあっても、実行時にUTF-16。
記述「<% page .... pageEncoding="UTF-8" %>」
によって、
response.setCharacterEncoding("UTF-8");
みたいなコードが生成され、実行される。
<%= requestParameter %>
みたいなのは、Javaコードとして、
writer.print( requestParameter );
として実行される。
このときはUTF-16。
先のresponse.setCharacterEncodingが指定されているので、出力が、フラッシュされるときには、UTF-16は、UTF-8に変換されてブラウザに送られる。
ありがとうございます。
すみません、おかげさまで、
最初に比べて随分と理解ができてきました^^;
2) サーブレット
間違えた変換がされているので、
2-1) 戻す
bytes = requestParameter.getBytes("iso-8859-1");
2-2) 正しく変換
requestParameter = new String( bytes, "UTF-8");
これで正しいUTF-16の状態
-------------------------------------------------------------
「これで正しいUTF-16の状態」というのは、
ここの「 new String( bytes, "UTF-8");」で
バイト変換した場合、"UTF-8"に文字コードセットされたデータを、
Javaが"UTF-16"として処理出来る状態になった、ということでしょうか?
No.2
- 回答日時:
>「UTF-8」であったものを「iso-2022-jp」で再度文字を変換してしまうため
すいません。間違えました、仮定する文字コードは「iso-8859-1」でした。
一から話すと、次のとおりです。
Javaの中では文字はUnicode(UTF-16)ですが、Javaの外では文字はリソースによって様々な文字コードで表現されます。
よって、外からの文字をJavaの中で同様に文字として扱えるようにするためには、その文字をUTF-16に変換する必要があるのですが、この時コンテナやフィルタで、元の文字コードを「iso-8859-1」と仮定してしまっているので、元の文字とは異なる文字に置き換えられてしまい、文字が化けることになります。
恐らくは、HTTPにリクエストパラメータの元の文字コードを指定する決められた方法が無いのでこの様になっているのではないかと思います。
>「getBytes("ISO-8859-1"),"UTF-8"); 」を付与し、コード変換する対象としては、現在文字化けが発生しているのは「日本語文字だけ」ですので、
>「日本語文字のみを対象とし、英数字については付与は不要」と考えているのですが、特に問題ありませんでしょうか?
1バイトの英数字だけなら大丈夫です。
正確に言えば、先の理屈から言えば、UTF-8とiso-8859-1とで、バイト値が変わらない文字(特に0x00~0x7f)ならどの文字も大丈夫です。
暗黙的にiso-8859-1としてUTF16に自動変換されていても元のバイト値が表す文字がUTF-8と一緒なので、結果的に同じ文字に変換してくれます。
ありがとうございます。
文字コードについて、段々と分かってきました。
>外からの文字をJavaの中で同様に文字として扱えるようにするためには、その文字をUTF-16に変換する必要があるのですが
これに驚きました。
(無知なだけかもしれませんが^^;)
UTF-8ではなくUTF-16をJavaでは使用しているのですね。
>バイト値が変わらない文字(特に0x00~0x7f)
http://www.ie.u-ryukyu.ac.jp/~e075739/3/Report/R …
調べてみたらこれってASCIIコードのことだったのですね。
>暗黙的にiso-8859-1としてUTF16に自動変換されていても元のバイト値が表す文字がUTF-8と一緒なので、結果的に同じ文字に変換してくれます。
元のバイト値が表す文字「あ」なら「あ」があったとして
utf-8(最初の画面) → iso-8859-1(コンテナ通過時) → UTF16(java通過時に自動変換する) → UTF-8(javaの中で getBytes("ISO-8859-1"),"UTF-8"); として設定) → utf-8(次の画面)
という流れで、
正常に文字化けなく表示される「“あ”が表示される」、となる、ということでしょうか?
No.1
- 回答日時:
こんにちわ。
間違えてないと思います。
うろ覚えですが、サーブレットコンテナかフィルタが、リクエストパラメータの文字コードをiso-2022-jpであると仮定してUnicodeに変換するために文字化けがおきると記憶しています。
Unicodeの文字列を元のバイナリに戻して、再度コンバートするのはそのためです。
スマートではないんですが、結構一般的なやり方だと思います。
ありがとうございます。
回答いただきました内容の方、とても助かります。
「基準なるべく基準」というものが、
ちょっとわかっていなかった矢先なので、助かりました。
>サーブレットコンテナかフィルタが、リクエストパラメータの文字コードをiso-2022-jpであると仮定してUnicodeに変換するために文字化けがおきると記憶しています。
つまり、リクエストパラメーターについては、
リクエスト時に「サーブレットコンテナ側、もしくはフィルタと呼ばれるもの」の規定?で
「UTF-8」であったものを「iso-2022-jp」で再度文字を変換してしまうため、再度「UTF-8」のコードを指定する必要がある。となる訳でしょうか?
またこれについて、
「getBytes("ISO-8859-1"),"UTF-8"); 」を付与し、コード変換する対象としては、現在文字化けが発生しているのは「日本語文字だけ」ですので、
「日本語文字のみを対象とし、英数字については付与は不要」と考えているのですが、特に問題ありませんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
つい集めてしまうものはなんですか?
人間誰もは1つ「やたらこればかり集めてしまう」というものがあるもの。 あなたにとって、つい集めてしまうものはなんですか?
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
昨日見た夢を教えて下さい
たまにすごいドラマチックな夢見ること、ありませんか? 起きてからも妙に記憶に残っているような、そんな夢。
-
架空の映画のネタバレレビュー
映画のCMを見ていると、やたら感動している人が興奮で感想を話していますよね。 思わずストーリーが気になってしまう架空の感動レビューを教えて下さい!
-
JSP/Servletのパラメータの受け渡しが文字化けしてうまくいきません。
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ダブルクォーテーションのrepla...
-
var now = +new Dateの +は何?
-
Visual Basic でのコードをASCI...
-
Path型をString型へ変換する(Java)
-
javaで質問です。 文字列2023/2...
-
エクセルVBAで「〜」が表現でき...
-
JSPやサーブレットでSystem.out...
-
パソコンキーボードで時分秒を...
-
大量のデータを読み込んで表示...
-
要素数が10の配列で、乱数0~9...
-
Java 入力した整数値の合計を、...
-
繰り返しによる星印の出力
-
JSPでHashMap・配列の変数の値...
-
演算子 ^ は double,double に...
-
論理演算子”||”またはの入力方法
-
iPhoneでのjavascriptで音を出...
-
空き番号探し
-
IF関数でEmpty値を設定する方法。
-
C#の質問
-
java プログラミングについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションのrepla...
-
javaで質問です。 文字列2023/2...
-
Path型をString型へ変換する(Java)
-
Visual Basic でのコードをASCI...
-
int型のゼロ埋め
-
javascriptで文字列のsjis利用...
-
エクセルVBAで「〜」が表現でき...
-
C言語32bitから64bitの移行につ...
-
カタカナをローマジに変換する。
-
UTF-8とUnicodeの互換性
-
文字列の比較
-
JavaのStringクラスに「外字」...
-
byte[] を long,float とかに...
-
COBOLで半角カナを全角カナに変換
-
javaの初歩的な質問です。
-
InputStream型のキャスト
-
substring バイト単位でやりたい
-
文字化け対策について
-
DBから取得したデータの文字化け
-
Windows-31Jからutf-8への変換...
おすすめ情報