Разбор и сохранение файла / или разбора строки из ISO-8859-3 в UTF-8 в JSP / Java - PullRequest
0 голосов
/ 21 февраля 2019

Что ж, прошло уже много времени с тех пор, как я теряю голову этим.Я пока не могу найти решение.Я много чего пробовал, но ничего не получается, поэтому я хотел бы спросить, как это сделать.И извините за плохой английский.

Я загружаю файл в веб-приложение JSP.Я использую некоторый плагин jQuery File Upload, но я не думаю, что это является ядром проблемы (я не отбрасываю, но ... файл загружен во временную папку, и это нормально).В любом случае, файл выглядит как это , и, как вы можете видеть, кодировка соответствует ISO-8859-3.

Я получаю данные следующим образом:

request.setCharacterEncoding("UTF-8");

    if (ServletFileUpload.isMultipartContent(request)) {
        ServletFileUpload servletFileUpload = new ServletFileUpload(new DiskFileItemFactory());
        List fileItemsList = servletFileUpload.parseRequest(request);
        Iterator it = fileItemsList.iterator();

        if (fileItemsList.size() > 0) {
            while (it.hasNext()) {
                FileItem fileItem = (FileItem) it.next();
                if (!fileItem.isFormField()) {
                    String nomCompleto = fileItem.getName();

                    saveFile = nomCompleto.substring(nomCompleto.lastIndexOf(separador) + 1).trim();

                    String ext = saveFile.substring(saveFile .lastIndexOf("."), saveFile.length());

                    if (ext.equalsIgnoreCase(".csv") || ext.equalsIgnoreCase(".txt")) {
                        fguarda = new File(ruta + saveFile);
                        fguarda.delete();
                        fileItem.write(fguarda);

                        ArrayList<String> lineas = FuncionesGenericas.leerArchivoUTF8(fguarda.getAbsolutePath());

Может быть, это может быть проблемой.Request.setCharacterEncoding ("UTF-8") был чем-то отчаянным, и я действительно не знаю, стоит ли мне его удалять.Но, как я уже сказал, это не имеет значения, файл загружен в исходную кодировку.

Я делаю тест для нового проекта с похожим методом, подобным тому, который извлекает строки и помещает их в массив (FuncionesGenericas.leerArchivoUTF-8), и где я пытаюсьпарсит каждую строку из ISO-8859-3 в UTF-8, но, похоже, ничего не работает.Я всегда получаю "?"вместо "á".

try {
        ArrayList<String> lineas = new ArrayList();

        FileReader fr;

        fr = new FileReader("C:\\Personal\\temp\\ffffff.txt");
        BufferedReader in = new BufferedReader(fr);
        String s;
        while ((s = in.readLine()) != null) {
            String UTF8Str = new String(s.getBytes("ISO-8859-3"), "UTF-8");
            String intento2 = new String(s.getBytes(Charset.forName("ISO-8859-3")), Charset.forName("UTF-8"));
            System.out.println("UTF8Str = " + UTF8Str);
            System.out.println("intento2 = " + intento2);


            lineas.add(UTF8Str);
        }
    } catch (Exception e) {
        System.out.println("e = " + e);
    }

Итак, я в основном пытаюсь разобрать строки из файла и сохранить их в массиве, но с другой кодировкой, я надеюсь, что кто-то может мне немного помочь,Я не знаю, можете ли вы порекомендовать мне другой способ сделать это.Я много чего перепробовал и ничего не получалось.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Проблема была решена другими способами.

Используя Apache Tika, я смог прочитать кодировку файла наилучшим из возможных способов (потому что в исследовании mi я обнаружил, что невозможно точно определить, какая кодировка имеет файл), поэтому, получив чистые строки(строки с символом, например, не заменяя его на?), я смог «правильно» прочитать файлы и получить правильные строки.

Первая функция читает файл.Второй обнаруживает кодировку, используя библиотеки Apache Tika (tika-app-1.17.jar).

public static ArrayList<String> leerArchivoUTF8(String xRuta) throws Exception {
    ArrayList<String> lineas = new ArrayList();
    String codificacion = detectarCodificacion(xRuta);
    BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(
                                   xRuta), codificacion));
    try {
        for (String s; (s = in.readLine()) != null; ) {
            lineas.add(s);
        }
    } finally {
        in.close();
    }
    return lineas;
}   

public static String detectarCodificacion(String xRuta) throws Exception {
    String codificacion = "";
    try {
        BufferedInputStream is = new BufferedInputStream(new FileInputStream(xRuta));
        CharsetDetector obj = new CharsetDetector();
        obj.setText(is);
        codificacion = obj.detect().getName();
    } catch(Exception e) {
        throw new Exception("Error al leer codificación: " + e);
    }
    return codificacion;
}
0 голосов
/ 21 февраля 2019

Нигде в коде кода сервлета вы не указываете кодировку ISO-8859-3.Фактически, вы звоните leerArchivoUTF8, который, кажется, специально говорит, что он читает файл как UTF-8.

Как сервер должен знать, что файл находится в ISO-8859-3?

Ваш Блокнот ++ знает, потому что это кодировка по умолчанию вашей ОС, но сервер этого не знает.

У вас есть 2 варианта:

  1. ИспользованиеNotepad ++ и сохраните файл в формате UTF-8.

  2. Добавьте поле ввода в форму для указания кодировки, чтобы сервер мог прочитать файл с помощью этой кодировки.


Что касается другого кода, вам нужно указать кодировку при чтении файла.

Для Java 8 +:

List<String> lineas = Files.lines(Paths.get("C:\\Personal\\temp\\ffffff.txt"),
                                  Charset.forName("ISO-8859-3"))
                           .collect(Collectors.toList());

Для Java 7+:

List<String> lineas = new ArrayList<>();
try (BufferedReader in = Files.newBufferedReader(Paths.get("C:\\Personal\\temp\\ffffff.txt"),
                                                 Charset.forName("ISO-8859-3"))) {
    for (String s; (s = in.readLine()) != null; ) {
        lineas.add(s);
    }
}

Для Java 5 +:

List<String> lineas = new ArrayList<String>();
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(
                                "C:\\Personal\\temp\\ffffff.txt"), "ISO-8859-3"));
try {
    for (String s; (s = in.readLine()) != null; ) {
        lineas.add(s);
    }
} finally {
    in.close();
}
...