UTF-8非同期要求からgbkアプリケーションへの処理方法2
フロントエンドjsは、符号化されたhttp要求をgbkのバックグラウンドアプリケーションに送信し、この場合、符号化復号化の処理を行う必要がある.
のように
127.0.0.1:8080/xxx.xhtml?keywords=%E8%87%AA%E8%A1%8C%E8%BD%A6&encode=utf-8
Webアプリケーションがこのような要求を受け取ると、アプリケーションまたはサーバ上でgbk符号化のブロック処理がデフォルトで行う場合、requestが用いられる.getParameterでは文字化けしが発生し、復号後の中国語文字の最後の文字は復号できません.
解決方法:request.getQueryString()方式は、queryStringを取得した後、このurlパラメータを自分で再解析します.コードは以下の通りです.
のように
127.0.0.1:8080/xxx.xhtml?keywords=%E8%87%AA%E8%A1%8C%E8%BD%A6&encode=utf-8
Webアプリケーションがこのような要求を受け取ると、アプリケーションまたはサーバ上でgbk符号化のブロック処理がデフォルトで行う場合、requestが用いられる.getParameterでは文字化けしが発生し、復号後の中国語文字の最後の文字は復号できません.
解決方法:request.getQueryString()方式は、queryStringを取得した後、このurlパラメータを自分で再解析します.コードは以下の通りです.
HttpServletRequest request ....;
String encode = StringUtil.trimToNull(request.getParameter("encode"));
// utf-8
if (StringUtil.isEqualsIgnoreCase(encode, "utf-8")) {
//
if (request != null) {
Enumeration parameterNames = request.getParameterNames();
if(parameterNames!=null){
while (parameterNames.hasMoreElements()) {
String parameterName = parameterNames.nextElement().toString();
String parameterValue = StringUtil.trimToNull(request.getParameter(parameterName));
if(parameterValue!=null){
//parameterValue = URLDecoder.decode(parameterValue, "UTF-8");
try {
//
String queryString = request.getQueryString();
String[] querys = StringUtil.split(queryString, "&");
if(querys!=null && querys.length > 0){
for(String query : querys){
parameterValue = StringUtil.substring(query, StringUtil.getLength(parameterName+"="));
parameterValue = URLDecoder.decode(parameterValue, encode);// encode
}
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
}
}
// ,
if (!StringUtil.isEmpty(parameterValue)) {
request.setAttribute(parameterName, parameterValue);
}
}
}
}else {
//
return false;
}
}
return true;