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で質問しましょう!
似たような質問が見つかりました
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- PHP phpのメールフォームの完了画面でメール受信のコードを書いています。 1 2023/05/31 11:39
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- PHP php ログイン 1 2022/11/01 00:24
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
このQ&Aを見た人はこんなQ&Aも見ています
-
カンパ〜イ!←最初の1杯目、なに頼む?
飲み会で最初に頼む1杯、自由に頼むとしたら何を頼みますか? 最初はビールという縛りは無しにして、好きなものを飲むとしたら何を飲みたいですか。
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
とっておきの手土産を教えて
お呼ばれの時や、ちょっとした頂き物のお礼にと何かと必要なのに 自分のセレクトだとついマンネリ化してしまう手土産。 ¥5,000以内で手土産を用意するとしたらあなたは何を用意しますか??
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら「ろうそくの数はあなたが好きな人の数です」と言われ浮気者扱いされたことをいまだに根に持っています。
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
jspからServletを呼び、元のjspページに戻るにはどうしたらよいですか?
Java
-
JSP/Servletのパラメータの受け渡しが文字化けしてうまくいきません。
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ダブルクォーテーションのrepla...
-
javascriptで文字列のsjis利用...
-
javaで質問です。 文字列2023/2...
-
Path型をString型へ変換する(Java)
-
C言語32bitから64bitの移行につ...
-
COBOLで半角カナを全角カナに変換
-
byte配列をImageに変換する
-
あるディレクトリにある複数の...
-
カタカナをローマジに変換する。
-
cookie から取り出すと文字化け
-
JAVA 文字コード変換
-
グレイコードの変換
-
JavaのStringクラスに「外字」...
-
半角カタカナをローマ字変換す...
-
int型のゼロ埋め
-
"\\n"を"<br>"にうまく変換でき...
-
Arduino(C言語) String "1101" ...
-
文字化け対策について
-
TEXTAREAからのデータを改行入...
-
文字コード変換
マンスリーランキングこのカテゴリの人気マンスリー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で半角カナを全角カナに変換
-
InputStream型のキャスト
-
javaの初歩的な質問です。
-
substring バイト単位でやりたい
-
文字化け対策について
-
Windows-31Jからutf-8への変換...
-
DBから取得したデータの文字化け
おすすめ情報