44333


JAX-RS（REST Easy）を使ってウェブAPIを作成しています。  
あるシステムの`<form>`からデータを受け取るAPIを作成しているのですが、日本語が文字化けしてしまいます。  
そのシステムの画面の文字コードはShiftJISです。

[code]

    @Path("test")
    public class TestApi {
    
        @POST
        @Path("hoge")
        @Produces("text/html")
        public String hoge(@FormParam("name") name) {
            ...
        }
    }
    
[/code]

上記のようなコードなのですが、`<form>`から "a"
という文字を送り、上記のAPI上でEclipseのデバッガからnameの値を見てみると、きちんと"a"が入っています。

しかし "あ" を送ると、" " という空白？文字になってしまいます。  
なお、文字列の長さは2であり、`codePointAt`を使って中を覗いてみると

[code]

    name.codePointAt(0)  -> 130
    name.codePointAt(1)  -> 160
    
[/code]

となっています。  
まさにこれはShiftJISの「あ」ですので、これをbyte配列に変換すれば、「ShiftJIS文字列 "あ"
のbyte配列から文字列を生成する」ということはできますので、一応、問題は解決します。

[code]

    byte[] bytes = new byte[name.length()];
    for (int i = 0; i < name.length(); i++) {
        bytes[i] = (byte)(name.codePointAt(i));
    }
    
    String name2 = new String(bytes, "sjis");
    
[/code]

ただShiftJISの文字列をJavaで受け取りたいだけなのに、ここまでしなければならないのでしょうか？  
他により良い手段というか、なにかアノテーション一発で文字コードを指定できるとか、そういう方法があれば知りたいです。


CC BY-SA 4.0
2018-05-28T08:32:20.833
44326
2019-01-30T14:01:55.343
8078
question
java java-ee jax-rs
JAX-RSの@FormParamでShiftJISを受け取れない


サーブレットフィルターでCharacter Encodingを設定する実装を追加すればよかったと思います。

[code]

    request.setCharacterEncoding("Shift_JIS");
    
[/code]

Tomcatを使用しているのであれば、`web.xml`に以下の定義を追加してみて下さい。

[code]

    <filter>
      <filter-name>SetCharacterEncodingFilter</filter-name>
      <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
      <init-param>
        <param-name>encoding</param-name>
        <param-value>Shift_JIS</param-value>
      </init-param>
    </filter>
    
    <filter-mapping>
      <filter-name>SetCharacterEncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    
[/code]


CC BY-SA 4.0
2018-05-28T11:55:50.247
44333
2018-05-28T12:36:26.797
2018-05-28T12:36:26.797
21092
21092
44326
answer