中文字符编码?

4
我有一个使用情况,我通过post请求向Spring控制器提交参数。 在控制器中,我正在读取参数并执行一些操作。之后,我将这些参数作为请求参数的一部分发送到其他URL。
在这里,我无法处理中文字符。它变得混乱了。
我现在正在执行以下操作: 1)我从HTML页面(不是JSP)传递以下中文文本作为名称为subject的参数。 以下便是有关此问题的所有信息
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作为第一个过滤器映射。此过滤器会将请求设置为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>

如果您需要更多上下文信息,请告诉我。


1
Philipp Sander的回答和在service.xml连接器中添加URIEncoding="UTF-8"应该就足够了。 - user794783
1
@CMR:OP明确提到这涉及POST请求。URIEncoding完全没有影响。 - BalusC
4个回答

2
如果您正在使用,请按照以下方式更改server.xml文件中的Connector。
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1"
    redirectPort="8443" useBodyEncodingForURI="true">
</Connector>

希望这能解决你的问题。
祝好, Kishore

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>

我曾经遇到过类似的问题,这个方法解决了它。


我在我的web.xml中有这个过滤器,但仍然没有用。 - Rajeev
我添加了映射,以防您忘记它。 - Philipp Sander
我有以下的映射。我认为它也很好。 <filter-mapping> <filter-name>EncodingFilter</filter-name> <servlet-name>SpringMVCServlet</servlet-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> - Rajeev
你能试试我的过滤器映射吗? - Philipp Sander

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文件中检查过了。


-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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接