我有一个用例,我通过post请求向spring controller提交参数。 在控制器中,我正在读取参数并执行某些操作。之后我将这些参数作为请求参数的一部分发送到其他URL。
在这里,我无法处理汉字。它变得乱码。
我现在正在做的动作: 1)我从HTML页面(这不是JSP)传递下面的中文文本作为名称主题的参数。 以下便是有关此问题的所有信息
2)当我从控制器中的请求中读取此值时,它将显示为: 以ä¸ä¾¿æ¯æå³æ¤é®é¢çææä¿¡æ¯
3)我无法获得从页面提交的确切值。
当我验证下面url的编码文本时,它看起来已经编码了: http://coderstoolbox.net/string/#!encoding=none&action=encode&charset=utf_8 http://www.cafewebmaster.com/online_tools/utf_decode
4)现在我想将实际用户提交的字符串作为response.sendRedirect传递给其他URL。我尝试解码URL以查看我是否可以获得实际字符串但没有成功。
我正在使用tomcat服务器。我在server.xml中定义了UTF-8编码,并在web.xml中添加了URLEncodingFilter作为第一个过滤器映射。此过滤器将request.setEncoding执行为UTF-8。
我仍然无法追踪出错的地方。有人可以建议我如何取回控制器中的实际字符串吗?
我的web.xml中还有以下过滤器
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
如果您需要任何信息以获取更多背景信息,请与我们联系。
答案 0 :(得分:2)
如果您正在使用,请更改server.xml文件中的连接器,如下所示
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1"
redirectPort="8443" useBodyEncodingForURI="true">
</Connector>
希望这能解决你的问题。
此致 基肖尔马布
答案 1 :(得分:0)
尝试将此过滤器添加到web.xml
:
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
并映射它:
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我有类似的问题,这解决了它。
答案 2 :(得分:0)
在下面进行解码后,我能够检索实际的字符串。我还在调查为什么我需要做拉丁语解码。一旦我完全理解了这个问题,我就会更新。如果您有任何人知道拉丁编码的原因,请告诉我。
public String getncodedSubject(String text) {
if (text == null || text.isEmpty()) {
return "";
}
try {
byte[] encoding1 = subject.getBytes("UTF-8");
String string1 = new String(encoding1, 0, encoding1.length); // Default encoding of my platform is UTF-8
byte[] encoding2 = string1.getBytes("ISO8859-1");//ISO-8859-1 (ISO Latin 1) Character Encoding
char[] hexaChars = Hex.encodeHex(encoding2);
StringBuilder str = new StringBuilder();
for(int i=0;i<hexaChars.length;i = i+2){
str.append("%");
str.append(hexaChars[i]);
str.append(hexaChars[i+1]);
}
return str.toString();
} catch (UnsupportedEncodingException e) {
System.out.println(e);
}
return "";
}
在挖掘更多之后,它似乎正在获得拉丁编码字符串:
import java.nio.charset.CharsetDecoder;
import java.nio.charset.Charset;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception {
byte[] encoding1 = "以ä¸ä¾¿æ¯æå³æ¤é®é¢çææä¿¡æ¯".getBytes("ISO8859-1");
for (byte b : encoding1) {
System.out.printf("%x ",b);
}
}
}
仍然我不确定如何获得拉丁编码字符串......有什么建议吗? 我也检查了我的server.xml
答案 3 :(得分:-1)
感谢每一位回复者。经过更多的调查,以下是我的观察。
我使用Mason(Perl + HTML)渲染我的页面而不使用JSP。所以我无法在页面中指定编码类型以强制浏览器提交UTF-8编码的字符串。
现在我使用“ISO8859-1”(拉丁语)进行编程解码,并使用UTF-8编码以获取实际字符串供消费。
请告诉我有一种方法可以在Mason中指定编码类型(Perl + HTML),这样它就可以使用UTF-8编码提交参数,而不是采用默认编码。
import java.nio.charset.CharsetDecoder;
import java.nio.charset.Charset;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception {
byte[] encoding1 = "以下便是有关æ¤é—®é¢˜çš„æ‰€æœ‰ä¿¡æ ¯".getBytes("ISO8859-1");
String s = new String(encoding1, "UTF-8");
System.out.println(s);
}
}