[CUBBY-178] リクエストのURIに日本語が含まれると文字化けする Created: 2008-08-29  Updated: 2009-07-05  Resolved: 2008-09-07

Status: Closed
Project: Cubby
Component/s: Core
Affects Version/s: 1.1.0
Fix Version/s: 1.1.1

Type: Bug Priority: Major
Reporter: agata Assignee: baba
Resolution: Fixed Votes: 0
Labels: None


 Description   

[cubby-user:84] URLに日本語を含めたときに文字化けします

cubbyを1.0.0から1.1.0にバージョンアップしたところ
下記の事象がありましたのでご報告します。

通常のパラメータはEncodingFilterが効いているため、文字化けしませんが、
パスに日本語を入れて、それを取得した場合、文字化けするようになりました。
例)
・パス (実際には日本語の部分はURLエンコードされてます)
/hoge/日本語/

・メソッド
@Path("/hoge/

{name,.+}

/")
public ActionResult hoge() {
・・・・・
}

現状、下記のコードを入れて回避しています。
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");

1.0.0のときは文字化けしていなかったので、
cubbyのフレームワークの方で何か変更等があったのでしょうか?



 Comments   
Comment by baba [ 2008-09-07 ]

ドキュメントのセットアップ、移行ガイドに追記しました。
FAQ のページも追加しました。

Comment by baba [ 2008-09-07 ]

上記設定はサーブレットコンテナ全体に対しての設定となるので、org.seasar.cubby.filter.EncodingFilter を追加して、エンコードを指定できるようにしました。
org.seasar.extension.filter.EncodingFilter との違いは、

  1. 初期化パラメータ encoding の初期値を持ちません。org.seasar.extension.filter.EncodingFilter は encoding を指定しない場合 Windows-31J になりますが、こちらは encoding を指定しなかった場合はリクエストのエンコーディングを設定しません。
  2. 初期化パラメータ forceEncoding を true に設定することで、リクエストヘッダで charset が指定されている場合も encoding でそれを上書きします。
  3. 初期化パラメータ URIEncoding で HttpServletRequest の getServletPath() と getPathInfo() で取得できる文字列のエンコーディングを指定できます。以下のようなコードで文字列を再構築します。
    new String(オリジナルのパス文字列.getBytes("ISO-8859-1"), URIEncoding);
    

    念のため、"ISO-8859-1" の部分も初期化パラメータ URIBytesEncoding で指定できるようにしてあります。

Comment by baba [ 2008-09-07 ]

Tomcat ならば、conf/server.xml の Connector ディレクティブに URIEncoding でエンコーディングを設定することで、getServletPath() と getPathInfo() で指定されたデコードされた文字列を取得できます。

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />
Comment by Anonymous [ 2008-08-29 ]

1.0.x では HttpServletRequest#getRequestURI を使っていました。
これは URL エンコードされた文字列が取得できるので文字化けしていなかったのですが、Jettyでは getRequestURI() の結果にセッションIDを表す文字列(;jsessionid=...)も含まれてしまいますので、パスのマッチングがうまくいきません。
なので、1.1.x では HttpServletRequest#getServletPath() と HttpServletRequest#getPathInfo() で URI を組み立てるように変更しました。
ここで Tomcat の場合、URI にマルチバイト文字が含まれると getServletPath() の結果は URL エンコードされた文字列ではなく ISO-8859-1 でエンコードされた文字列になってしまいます。(Jetty の場合は UTF-8 でエンコードされるので化けていない)

Generated at Sat Apr 27 06:08:09 JST 2024 using Jira 9.15.0#9150000-sha1:9ead8528714127d8cfabf2446010d7e62c0a195c.