質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1248閲覧

サーブレットから受け取った三次元配列の日本語のエンコードを変更したい

D0nald_shrimp

総合スコア1

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/07/07 16:54

前提・実現したいこと

サーブレット・jspで学生向けカレンダーシステムを作成しています。
時間割登録機能を作成する過程で、複数のドロップダウンメニューで各々の授業情報をユーザーに選択させ、取得した値(日本語の授業名)をString型の配列にする→サーブレットに送信→String型の三次元配列に変換→jspに値を渡して時間割を描画
という流れになるように作成しました。エンコードはutf-8にしていたのですが、どうやら値の受け渡しの段階で勝手にISO8859-1に変更されているらしく、文字化けしてしまいます。
そこで、こちらのサイトを参考にgetByte関数を使用することを考えたのですが、うまくいきません。
getByte関数は三次元配列では使えないのでしょうか?それとも私の書き方がいけないだけで使えるのでしょうか?
また、ほかの方法が存在するのであれば教えていただきたいです。

発生している問題・エラーメッセージ

org.apache.jasper.JasperException: JSPのクラスをコンパイルできません: JSPファイル: [/jsp/jikanwari.jsp] の中の[8]行目でエラーが発生しました Cannot invoke getBytes(String) on the array type String[][][] 5: String[][][] timetable = (String[][][]) request.getAttribute("tmp"); 6: 7: try { 8: byte[][][] byteData = timetable.getBytes("ISO_8859_1"); 9: timetable = new String[][][](byteData, "utf-8"); 10: }catch(UnsupportedEncodingException e){ 11: System.out.println(e); JSPファイル: [/jsp/jikanwari.jsp] の中の[9]行目でエラーが発生しました The constructor String(byte[][][], String) is undefined 6: 7: try { 8: byte[][][] byteData = timetable.getBytes("ISO_8859_1"); 9: timetable = new String[][][](byteData, "utf-8"); 10: }catch(UnsupportedEncodingException e){ 11: System.out.println(e); 12: } JSPファイル: [/jsp/jikanwari.jsp] の中の[9]行目でエラーが発生しました Type mismatch: cannot convert from String to String[][][] 6: 7: try { 8: byte[][][] byteData = timetable.getBytes("ISO_8859_1"); 9: timetable = new String[][][](byteData, "utf-8"); 10: }catch(UnsupportedEncodingException e){ 11: System.out.println(e); 12: } JSPファイル: [/jsp/jikanwari.jsp] の中の[9]行目でエラーが発生しました Syntax error on token(s), misplaced construct(s) 6: 7: try { 8: byte[][][] byteData = timetable.getBytes("ISO_8859_1"); 9: timetable = new String[][][](byteData, "utf-8"); 10: }catch(UnsupportedEncodingException e){ 11: System.out.println(e); 12: } JSPファイル: [/jsp/jikanwari.jsp] の中の[10]行目でエラーが発生しました UnsupportedEncodingException cannot be resolved to a type 7: try { 8: byte[][][] byteData = timetable.getBytes("ISO_8859_1"); 9: timetable = new String[][][](byteData, "utf-8"); 10: }catch(UnsupportedEncodingException e){ 11: System.out.println(e); 12: } 13: %> Stacktrace: org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:102) org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:212) org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:457) org.apache.jasper.compiler.Compiler.compile(Compiler.java:379) org.apache.jasper.compiler.Compiler.compile(Compiler.java:351) org.apache.jasper.compiler.Compiler.compile(Compiler.java:335) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:595) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:368) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) TestServlet.doPost(Unknown Source) javax.servlet.http.HttpServlet.service(HttpServlet.java:661) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

該当のソースコード

java

1String[][][] timetable = (String[][][]) request.getAttribute("tmp"); 2 3 try { 4 byte[][][] byteData = timetable.getBytes("ISO_8859_1"); 5 timetable = new String[][][](byteData, "utf-8"); 6 }catch(UnsupportedEncodingException e){ 7 System.out.println(e); 8 } 9 10 11//参照先サイトのコード 12public class Sample extends HttpServlet { 13 public void doGet(HttpServletRequest request, HttpServletResponse response) 14 throws IOException, ServletException{ 15 16 String val = request.getParameter("name"); 17 18 try { 19 byte[] byteData = val.getBytes("ISO_8859_1"); 20 }catch(UnsupportedEncodingException e){ 21 System.out.println(e); 22 } 23 } 24} 25

試したこと

上記の通り

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

そもそもプルダウンメニューで選択した値をサーブレットに渡す時点でエンコードが変わっていたようで、サーブレット内でrequest.setCharacterEncoding("utf-8");
のように書き、他のファイルでは特に何もしなかったらうまくいきました。
なんだかよくわからんが動いたのでヨシ!
なお、まだ質問の方法で書くやり方は判明していないため、一応まだ未解決ということにしておきます。どこかの優しい方がいましたら教えてください。

投稿2020/07/07 17:54

D0nald_shrimp

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/07/08 19:21

と言ってもコードが半端な状態でjspも提示されてなければどんな優しい人でも熟練者でもアドバイスはできませんよ。 半分以上、想像で補完せねばなりませんし、習熟度の差があればあるほど、ずれます。
m.ts10806

2020/07/08 19:23

直接的な表現をすると、エスパーを強いているだけ、なので、 全て提示しないのであれば、自己回答による解決済みにした方が良いかと思います。 (ただ、誰の参考にもならなくなりますが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問