解析并保存 file/or 将字符串从 ISO-8859-3 解析为 JSP/Java 中的 UTF-8

Parse and save file/or parse string from ISO-8859-3 to UTF-8 in JSP/Java

好吧,我已经有一段时间没有为此动脑筋了。我还找不到解决办法。我尝试了很多东西,但似乎没有任何效果,所以我想问一下如何做到这一点。抱歉英语不好。

我正在 JSP Web 应用程序上上传文件。我使用了一些 jQuery 文件上传插件,但是,我不认为这是问题的核心(我没有丢弃,但是......文件被上传到一个临时文件夹,没关系) .无论如何,该文件看起来像 this,正如您所见,字符集是 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);
    }

所以,我基本上是在尝试解析文件中的字符串并将它们存储在数组中,但是使用不同的字符集,我希望有人能帮我一点忙。我不知道你是否可以推荐我其他方法来做到这一点。我尝试了很多东西,但没有任何效果。提前致谢!

您在代码 Servlet 代码中没有指定字符集 ISO-8859-3。事实上,你调用 leerArchivoUTF8,这似乎明确表示它正在以 UTF-8 格式读取文件。

服务器如何知道文件在 ISO-8859-3 中?

您的 Notepad++ 知道,因为那是您 OS 的默认字符集,但服务器不知道。

您有 2 个选择:

  1. 使用 Notepad++ 并以 UTF-8 格式保存文件。

  2. 在表单中添加输入字段以指定字符集,以便服务器可以使用该字符集读取文件。


至于你的其他代码,你读文件的时候需要给charset。

对于 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();
}

问题已通过其他方式解决。

使用 Apache Tika 我能够以最好的方式读取文件编码(因为在 mi 研究中我发现不可能正确知道文件的编码),因此,通过获取干净的字符串(例如,带有 áéíóú 的字符串,而不是将其替换为 ?),我能够 "correctly" 读取文件并获得正确的字符串。

第一个函数读取文件。第二个检测编码,使用 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;
}