我必须读取一些文件的名称并将它们作为字符串放入列表中。没那么难,我只是遇到了一些问题,比如 ä,ö,ü 之类的字符......它们总是作为“?”在我的字符串中。
问题是什么?好的编码。好的,这应该很容易...这就是我的想法。所以我尝试使用如下函数:
新字符串(insert.getBytes("UTF-8")
或者
新字符串(insert.getBytes(“ISO-8859-1”),“UTF-8”)
因为大部分文件都是 ISO-8859-1
没用。这是我的代码:
...
File[] fileList = dir.listFiles();
String insert;
for(File f : fileList) {
...
insert=f.getName().substring(0,f.getName().length()-4);
insert=insert.charAt(0)+insert.substring(1,insert.length()).toLowerCase().replaceFirst("([0-9]*(_s?(i)?(_dat)?)*$)", "").replaceFirst("_", " ");
...
System.out.println("test UTF8: " + new String(insert.getBytes("UTF-8"))); //not helping
System.out.println("test ISO , UTF8: " + new String(insert.getBytes("ISO-8859-1"), "UTF-8")); //not helping
...
names.add(insert);
}
最后有很多带'?'的字符串我列表中的字符。 如何解决这个问题?如果不仅有 ISO-8859-1 文件,最好的方法是什么? (假设有很多未知的编码文件)
谢谢!
最佳答案
考虑到问题下来回的扩展评论,现在看来这要么是字体问题,要么(可能更有可能)是文件名编码问题。
我让 Lissy 运行以下命令让我们找出问题所在。如果她确定文件名中包含“ä”,但是当她ls
文件名时该字符没有出现,那么此命令将告诉我们这是字体问题还是编码问题。
touch filenäme
ls filen*me
如果这在 ls
的输出中显示“filenäme”,那么我们就知道问题出在将文件创建/复制到该系统上。如果创建文件的程序没有意识到文件系统编码是什么或者太愚蠢而不能做正确的事情,就会发生这种情况。 convmv
程序可能是解决此问题的最佳方法。
convmv -f ENCODING -t utf8 -r .
问题是什么是正确的编码。可能包括 UTF-16、cp850 或 iso8859-1。 convmv --list
将向您显示当前已知的(您的系统)编码列表。由于上面列出的命令只向您展示了它可能执行的操作,因此可以安全地使用不同的编码运行多次,直到您找到一个适用于所有文件的编码。
如果这是字体问题,我们将不得不调查一下
关于java - 获取 UTF-8 格式的文件名? (ä,ü,ö ... 总是 '?' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6117624/