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

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

ただいまの
回答率

88.93%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 268

前提・実現したいこと

サーブレット・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)

該当のソースコード

String[][][] timetable =  (String[][][]) request.getAttribute("tmp");

    try {
      byte[][][] byteData = timetable.getBytes("ISO_8859_1");
      timetable = new String[][][](byteData, "utf-8");
    }catch(UnsupportedEncodingException e){
      System.out.println(e);
    }


//参照先サイトのコード
public class Sample extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

    String val = request.getParameter("name");

    try {
      byte[] byteData = val.getBytes("ISO_8859_1");
    }catch(UnsupportedEncodingException e){
      System.out.println(e);
    }
  }
}

試したこと

上記の通り

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/09 04:21

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

    キャンセル

  • 2020/07/09 04:23

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

    キャンセル

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る