【问题标题】:Apache POI or java.io support non-English character or not?Apache POI 或 java.io 是否支持非英文字符?
【发布时间】:2015-07-27 07:58:20
【问题描述】:

我使用 Apache POI 从 Excel 文件中读取数据,以获取 docx、doc、xls 和 xlsx 文件的路径,解密文件内容并构建新路径以读回数据。

现在的问题是当路径有法语字符时,如下所示:

/Valérie/CASES.doxcs
is = new FileInputStream(path);

这行会有以下异常:

(No such file or directory)
at java.io.FileInputStream.open(Native Method)

它适用于其他路径,这是否意味着 Apache POI 不支持非英文字符或其他错误?无论如何要解决这个问题?

【问题讨论】:

  • FileInputStream 不是 Apache POI 的一部分 - 它只是在 Java 核心库中。 POI 与此无关。我建议您创建一个简短但完整的程序,只是尝试在适当的文件上打开FileInputStream
  • @JonSkeet thx 提醒一下,你是对的

标签: java apache-poi


【解决方案1】:

由于这是操作系统问题,您可以转换路径:

static String toFileName(String name) {
    return java.text.Normalizer.normalize(name, Form.NFKD)
            .replaceAll("\\P{ASCII}", ""); //.replaceAll("[\"/\\]", "_");
}

上面会将é 转换为e 等等,方法是将重音字母拆分为基本字母加重音符号。可能有更好的音译。并考虑西里尔文和其他脚本。

更好的解决方案是迁移到使用 UTF-8 的 Linux 系统。您可能仍希望将重音使用规范化为一种独特的形式,例如最短的字符序列:

static String toFileName(String name) {
    return java.text.Normalizer.normalize(name, Form.NFKC);
}

【讨论】:

  • 嗨,我将工作区文本文件编码更改为 utf-8,这就是我获取带有特殊字符的路径的方式。我用你的代码试过了,还是不行,是不是配置有问题?谢谢
  • 在“西方”系统上Valérie 应该没有问题。编写一个单独的小应用程序来测试哪里出了问题,一步一步地做所有事情。当瓦莱丽在某个地方错误地皈依时,就会有这样的事情。检查错误的转换:new String(bytes), String.getBytes(), FileReader/FileWriter, InputStreamReader(stream), OutputStreamWriter(stream).
【解决方案2】:

How can I open files containing accents in Java?。 尝试了此链接上的所有内容。对于大多数情况,Eclipse window->preference->general->workspace 中的配置设置为 utf-8,并且 project-> running as configuration vm Arguments:Dfile.encoding=UTF-8 应该已经解决了问题。

但是如果你的 JDK 不是 SUN 并且你是在 linux 系统中。你最好 echo $LANG 确保它是 UTF-8 ,然后通过 linux 命令行编译和运行 java src 代码。问题解决了。在 linux 中运行的 java 代码链接: http://www.sergiy.ca/how-to-compile-and-launch-java-code-from-command-line/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多