4

我有一个用例,我通过发布请求向弹簧控制器提交参数。在控制器中,我正在读取参数并执行一些操作。之后,我将这些参数作为请求参数的一部分发送到其他 URL。

在这里我无法处理汉字。它越来越乱码。

我现在正在执行的操作: 1) 我在中文文本下方作为参数传递,其中包含来自 HTML 页面的名称主题(这不是 JSP)。下面是有关此问题的所有信息</p>

2)当我从控制器中的请求中读取此值时,它是:以ä¸ä¾¿æ¯æå³æ¤é®é¢çææä¿¡æ¯

3)我无法获得从页面提交的确切值。

当我在以下网址验证编码文本时,它看起来已经编码: 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>

如果您需要任何信息以获取更多上下文,请告诉我。

4

4 回答 4

2

如果您正在使用,请更改 server.xml 文件中的连接器,如下所示

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1"
    redirectPort="8443" useBodyEncodingForURI="true">
</Connector>

希望这能解决您的问题。

问候,基肖尔

于 2014-11-28T07:00:18.253 回答
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

于 2013-08-15T03:31:07.957 回答
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>

我有一个类似的问题,这解决了它。

于 2013-08-13T14:34:40.313 回答
-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);
    }
}
于 2013-08-15T15:46:06.253 回答