java中的文件名字符集问题

java中的文件名字符集问题,java,encoding,jboss,Java,Encoding,Jboss,当文件名带有重音符号时,由于字符集不匹配,尝试打开文件时会声明找不到该文件。 我在linux系统上使用UTF-8(/etc/locales也设置UTF-8)。使用-Dfile.encoding=UTF-8和环境变量jboss_encoding=“UTF-8”运行jboss 使用JSP,我将获得文件名: String fileName = element.getChildText("FileName"); out.println("File to be opened : " + filename)

当文件名带有重音符号时,由于字符集不匹配,尝试打开文件时会声明找不到该文件。 我在linux系统上使用UTF-8(/etc/locales也设置UTF-8)。使用-Dfile.encoding=UTF-8和环境变量jboss_encoding=“UTF-8”运行jboss

使用JSP,我将获得文件名:

String fileName = element.getChildText("FileName");
out.println("File to be opened : " + filename);
显示:

要打开的文件:aaaaaá.txt

但是,新文件(文件名)不起作用。Just file.exists()为false

试图:

File[] files = dir.listFiles();
for (int i=0; i<files.length; i++){
      out.println(fileName);
File[]files=dir.listFiles();
对于(int i=0;i请尝试以下方法:


我正在努力找出问题所在。以下是我已有的:

存在
。java

import java.io.*;

public class Exists {
  public static void main(String[] args) {
    new File("aaa").exists();
    new File("aaa\u00E4").exists();
    new File("aaa\u00C3\u00A4").exists();
  }
}
还有
java-version

java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) 64-Bit Server VM (build 16.3-b01, mixed mode)
现在来看有趣的部分:

$ strace -f -o strace.out java Exists && grep 'stat("aaa' strace.out
31942 stat("aaa", 0x41464950)           = -1 ENOENT (No such file or directory)
31942 stat("aaa\303\244", 0x41464950)   = -1 ENOENT (No such file or directory)
31942 stat("aaa\303\203\302\244", 0x41464950) = -1 ENOENT (No such file or directory)
好在
strace
在字节级工作,而不是像Java那样在字符级工作。所以在这种情况下一切正常。我将环境变量
LANG
设置为
en_US.UTF-8
,所有
LC.*
变量都未设置

现在将问题追溯到一个最小的工作示例:

$ strace -f -o strace.out env - LC_ALL=en_US.UTF-8 /home/roland/bin/java Exists && grep 'stat("aaa' strace.out
31968 stat("aaa", 0x41a75950)           = -1 ENOENT (No such file or directory)
31968 stat("aaa\303\244", 0x41a75950)   = -1 ENOENT (No such file or directory)
31968 stat("aaa\303\203\302\244", 0x41a75950) = -1 ENOENT (No such file or directory)
这仍然有效。因此,让我们尝试另一种编码:

$ strace -f -o strace.out env - LANG=en_US.ISO-8859-1 /home/roland/bin/java Exists && grep 'stat("aaa' strace.out
32070 stat("aaa", 0x407a3950)           = -1 ENOENT (No such file or directory)
32070 stat("aaa?", 0x407a3950)          = -1 ENOENT (No such file or directory)
32070 stat("aaa??", 0x407a3950)         = -1 ENOENT (No such file or directory)
一个可能的原因可能是我选择了一个不在
locale-a
打印的列表中的区域设置。但这不应该是Java将字母转换为问号的原因


只要LANG指向一个不存在的区域设置,
sun.jnu.encoding
属性的设置就不再有任何效果。所以我现在没有主意了。

-Dfile.encoding=UTF-8
是特定于sun/Oracle JVM的。你在使用什么JVM?即使这样,你也不应该使用这个参数。@BalusC:我不确定是什么至少IBM JVM也支持“-Dfile.encoding”标记(我不确定今天有多少其他JVM被认真使用).JVM是Java热点,所以它符合我在Linux上尝试过的注释,但也失败了。尽管我尝试了
LANG
LC\u all
file.encoding
sun.jnu.encoding
的所有组合,但Java无法正确获取文件名,但没有成功。还有其他想法吗?没有更多想法了。似乎是这样的o调查字符集并尝试所有人。这篇文章似乎没有给出解决方案,但在回答问题时,我的答案总是UTF-8。在尝试用UTF-8编码ISO时,应该显示问号。看起来你做的是相反的,所以应该写“÷”。我想这是一个控制台问题,包括在UTF(再次)中写入strace转换为ISO的内容。不,不是。为什么UTF-8字节应显示为八进制转义,而拉丁1字节不显示?正如我所说,
strace
在字节级别工作。否则,它对二进制数据将毫无用处。
“aaa\u00C3\u00A4”
并不是您认为的意思。它代表五个字符,而不是五个字节。文件名只有四个字符长。
“aaa\u00E4”
是正确的。我选择了
“aaa\u00C3\u00A4”
示例是故意的,我知道它表示字符串
aaaÃ
。我选择它是为了在我设置
LC_ALL=en_US.ISO-8859-1
的测试用例中将其翻译为
aaaä