нераспознанный символ при отображении текста с разделителями на сервлете

Я работаю над сервлетом, который принимает zip-файл, распаковывает и отображает содержимое CSV-файлов.

Пока я могу отобразить несколько записей. Однако, как показано на изображении ниже, в одной из записей отображаются «вопросительные знаки»/нераспознанные символы.

Я проверил файл csv, и все в порядке. Я также пытался удалить текст и набирал какой-то другой текст, но все равно безуспешно.

образ проблемы:

https://dl.dropbox.com/u/11910420/Screen%20Shot%202012-09-07%20at%203.18.46%20PM.png

открытый класс AdminBootStrap расширяет HttpServlet {

public void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws IOException {
    resp.setContentType("text/plain");

    PrintWriter out = resp.getWriter();

    try {
        ServletFileUpload upload = new ServletFileUpload();

        FileItemIterator iterator = upload.getItemIterator(req);

        while (iterator.hasNext()) {
            FileItemStream item = iterator.next();
            InputStream in = item.openStream();

            if (item.isFormField()) {
                out.println("Got a form field: "
                        + item.getFieldName());
            } else {
                out.println("Got an uploaded file: "
                        + item.getFieldName() + ", name = "
                        + item.getName());

                ZipInputStream zis = new ZipInputStream(
                        new BufferedInputStream(in));

                ZipEntry entry;

                // Read each entry from the ZipInputStream until no
                // more entry found indicated by a null return value
                // of the getNextEntry() method.
                //

                byte[] buf = new byte[5000];
                int len;
                String s = null;

                while ((entry = zis.getNextEntry()) != null) {

                    out.println("Unzipping: " + entry.getName());

                    if (entry.getName().equalsIgnoreCase("booking.csv")) {

                        while ((len = zis.read(buf)) > 0) {
                            s = new String(buf);

                            String[] arrStr = s.split("\\n");
                            for (String a : arrStr) {

                                out.println(a);

                            }// end for

                        }

                    }

Любые идеи?


person chuntato    schedule 07.09.2012    source источник


Ответы (1)


Виновником является s = new String(buf), потому что он декодирует строку байтов в строку символов с помощью кодировки по умолчанию. К сожалению, кодировка по умолчанию в GAE — US-ASCII.

Вы должны кодировать свой CSV. Например, для UTF-8 используйте:

s = new String(buf, "UTF-8");
person Peter Knego    schedule 07.09.2012