Преобразование кодировки параметров в стойки2 - PullRequest
0 голосов
/ 04 марта 2010

У меня есть веб-приложение struts2, которое принимает запросы 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);
    }

Любые идеи о том, что попытаться заставить это работать?

Спасибо и всего наилучшего,

бозо

1 Ответ

0 голосов
/ 25 марта 2010

Я не уверен в вашем сценарии. В Java String - это Unicode, преобразование кодировки выполняется только в том случае, если необходимо преобразовать из / в String в / из двоичного представления. В вашем примере, когда вызывается getSimpleParamValue («some_input_param_from_get»), inputData уже должна иметь «правильную» строку, преобразование из потока байтов (который прошел от браузера клиента до веб-сервера) в строку уже должно было занять часть (ответственность веб-сервера + веб-слой вашего приложения). Для этого я использую UTF-8 для передачи через Интернет, поместив фильтр в файл web.xml (до Struts), например:

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, я бы сказал, что у вас проблемы, вы должны явно решить это до / после него (в верхнем веб-слое - или в драйвере базы данных, или в кодировке файла, или в любом другом случае)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...