Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java struts2中的参数字符集转换_Java_Struts2 - Fatal编程技术网

Java struts2中的参数字符集转换

Java struts2中的参数字符集转换,java,struts2,Java,Struts2,我有一个struts2 web应用程序,它接受许多不同字符集中的POST和GET请求,将它们转换为utf-8,在屏幕上显示正确的utf-8字符,然后将它们写入utf-8数据库 首先,我尝试了至少5种不同的方法来完成从windows-1250到utf-8的简单无损字符集转换,但都没有成功。Utf-8是一个更大的集合,它应该可以毫无问题地工作至少这是我的理解 你能建议如何从windows-1250到utf-8进行字符集转换吗?struts2是否可能在params字符集上做了一些奇怪的事情,这可以解释

我有一个struts2 web应用程序,它接受许多不同字符集中的POST和GET请求,将它们转换为utf-8,在屏幕上显示正确的utf-8字符,然后将它们写入utf-8数据库

首先,我尝试了至少5种不同的方法来完成从windows-1250到utf-8的简单无损字符集转换,但都没有成功。Utf-8是一个更大的集合,它应该可以毫无问题地工作至少这是我的理解

你能建议如何从windows-1250到utf-8进行字符集转换吗?struts2是否可能在params字符集上做了一些奇怪的事情,这可以解释为什么我似乎不能正确地进行转换

这是我的最新尝试:

    String inputData = getSimpleParamValue("some_input_param_from_get");
    Charset inputCharset = Charset.forName("windows-1250");
    Charset utfCharset = Charset.forName("UTF-8");

    CharsetDecoder decoder = inputCharset.newDecoder();
    CharsetEncoder encoder = utfCharset.newEncoder();

    String decodedData = "";
    try {
        ByteBuffer inputBytes = ByteBuffer.wrap(inputData.getBytes()); // I've tried putting UTF-8 here as well, with no luck
        CharBuffer chars = decoder.decode(inputBytes);

        ByteBuffer utfBytes = encoder.encode(chars);
        decodedData = new String(utfBytes.array());

    } catch (CharacterCodingException e) {
        logger.error(e);
    }
有什么办法让它工作吗

谢谢你,并致以最良好的祝愿


波佐

我不确定你的情况。在Java中,字符串是Unicode,只有在必须从/到字符串转换为/从二进制表示时才处理字符集转换。 在您的示例中,当调用getSimpleParamValuesome_input_param_from_get时,inputData应该已经有了正确的字符串,从客户端浏览器到web服务器的字节流到字符串的转换应该已经成为应用程序web服务器+web层的一部分。 为此,我对web传输强制使用UTF-8,在Struts之前的web.xml中放置一个过滤器,例如:

public class CharsetFilter implements Filter {

    public void destroy() {}

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        req.setCharacterEncoding("UTF-8");

        chain.doFilter(req, res);
        String contentType = res.getContentType(); 
        if( contentType !=null && contentType.startsWith("text/html"))
            res.setCharacterEncoding("UTF-8");
    }

    public void init(FilterConfig filterConfig) throws ServletException {
    }
}
如果无法执行此操作,并且如果getSimpleParamValue在字符集转换中出错,例如:假设字节流是UTF-8,是windows-1250,则您现在有一个错误的字符串,您必须尝试通过撤消并重新执行字节到字符串的转换来恢复它-在这种情况下,您必须知道错误和正确的字符集-更糟糕的是,处理丢失字符的可能性如果它被解释为UTF8,我可能会发现非法的字符序列。
如果您必须在Struts2操作中处理此问题,我会说您遇到了问题,您应该在上层web层中,或者在数据库驱动程序中,或者在文件编码中,或者在任何情况下,在HTTP参数中获得字符集名称,并且从中我现在必须知道如何将输入参数从win1250转换为UTF-8.BTW,我的web应用程序中也有类似的过滤器,但这对我来说还不够。所以现在我在Struts之前放了一个PHP过滤器,它将iconv从源字符集转换为UTF-8,这非常有效。我无法相信用Java完成同样的事情有多么复杂——非常困难。