Spring MVC中国語文字列の文字化けを回復するソリューション
2488 ワード
問題:Controller層の方法において、追加 @ReponseBodyコメント後、直接文字列に返信することができますが、返事の内容に中国語があると文字化けが発生しますか?
理由:
我々は文字列を返しますので、SpringはAnnotationMethodhandler Adapterを通じて対応するHttpMessage Coverterを探しに行きます。StringHttpMessage Coverterを見つけます。ソースを確認すると、このタイプのデフォルトのコードフォーマットは ISO-859-1、一部のソースコードは以下の通りです。
(推奨)案一:
spring mvcプロファイルには、以下の構成が追加されています。
シナリオ2:
はい、 @Request Mappingにproducesフィールドを追加しました。以下の通りです。
@Request Mapping(value=「/xxxt.do」、produces=「text/html;charset=UTF-8」)
シナリオ3:
オリジナルの方法を採用して、方法では、HttpServletResonseパラメータを増加し、HttpServletResonseオブジェクトから返信内容を出力し、以下のようにする。
理由:
我々は文字列を返しますので、SpringはAnnotationMethodhandler Adapterを通じて対応するHttpMessage Coverterを探しに行きます。StringHttpMessage Coverterを見つけます。ソースを確認すると、このタイプのデフォルトのコードフォーマットは ISO-859-1、一部のソースコードは以下の通りです。
public class StringHttpMessageConverter extends AbstractHttpMessageConverter {
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
private final Charset defaultCharset;
private final List availableCharsets;
private boolean writeAcceptCharset = true;
/**
* A default constructor that uses {@code "ISO-8859-1"} as the default charset.
* @see #StringHttpMessageConverter(Charset)
*/
public StringHttpMessageConverter() {
this(DEFAULT_CHARSET);
}
/**
* A constructor accepting a default charset to use if the requested content
* type does not specify one.
*/
public StringHttpMessageConverter(Charset defaultCharset) {
super(new MediaType("text", "plain", defaultCharset), MediaType.ALL);
this.defaultCharset = defaultCharset;
this.availableCharsets = new ArrayList(Charset.availableCharsets().values());
}
ソリューション: (推奨)案一:
spring mvcプロファイルには、以下の構成が追加されています。
説明:実は指定です。 StringHttp Message Coverter類コンストラクタのパラメータ値はUTF-8であり、この方法はコードの侵入性が低く、苦労して永逸しますので、おすすめします。シナリオ2:
はい、 @Request Mappingにproducesフィールドを追加しました。以下の通りです。
@Request Mapping(value=「/xxxt.do」、produces=「text/html;charset=UTF-8」)
シナリオ3:
オリジナルの方法を採用して、方法では、HttpServletResonseパラメータを増加し、HttpServletResonseオブジェクトから返信内容を出力し、以下のようにする。
@RequestMapping(value = "/xxxx.do")
@ResponseBody
public String fetchFlowPackage(@RequestParam(required = true) String param, HttpServletResponse response) {
response.setHeader("Cache-Control", "no-cache");
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
try {
PrintWriter out = null;
out = response.getWriter();
out.write(" xxxx");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
ありがとうございます