我必须读取一些文件的名称,并将它们作为字符串放在列表中.它不是那么难我只是对ä,ö,ü等一些人物有一些问题…他们总是像’?’在我的字符串中.
有什么问题?那么编码.好吧,这应该很容易……这就是我的想法.所以我尝试使用如下函数:
new String(insert.getBytes(“UTF-8”)
要么
new String(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运行以下命令让我们弄清问题是什么.如果她确定文件名中包含“ä”,但是当她使用文件名时该字符没有出现,则此命令将告诉我们这是字体还是编码问题.
touch filenäme
ls filen*me
如果这在ls的输出中显示“filenäme”,那么我们知道问题在于将文件创建/复制到该系统上.如果创建文件的程序没有意识到文件系统编码是什么,或者为了做正确的事情太愚蠢,就会发生这种情况. convmv程序可能是解决这个问题的最佳方法.
convmv -f ENCODING -t utf8 -r .
问题是什么是正确的编码.可能性包括UTF-16,cp850或iso8859-1. convmv –list将显示当前已知(对您的系统)编码的列表.由于上面列出的命令只显示它可能会执行的操作,因此可以安全地使用不同的编码运行多次,直到找到适用于所有文件的命令.
如果这是一个字体问题,我们将不得不调查
标签:java,encoding,utf-8
来源: https://codeday.me/bug/20190621/1254661.html