我在Linux机器上的默认字符集是US-ASCII。如果我用变音符号上传文件,则编码有问题。
在示例中,我创建了一个名为standü.png的文件。 如果我这样做
new String(f.getName().getBytes(Charset.defaultCharset()),"UTF-8");
我的结果是stand?.png。但我想要standü.png(带有变音符号)
//Default Charset is US-ASCII
System.out.println(Charset.defaultCharset());
String s = "standü.png";
File f = new File(s);
String newstr = new String(f.getName().getBytes(Charset.defaultCharset()),"UTF-8");
System.out.println(newstr);
我的输出是:
US-ASCII
stand?.png
答案 0 :(得分:0)
我现在在美国旧金山附近的Mac上,正在运行各种Java 8花园。当我按原样运行您的代码时,我会得到变音符号:
UTF-8
standü.png
我有点想得到这个,因为从过去的经验中我知道我的默认Charset是某种可以保留外来字符的unicode。为什么使用默认的字符集ASCII?这似乎是您的问题。
正如我在评论中所说,我认为您可以将“ Charset.defaultCharset()”更改为“ Charset.forName(“ UTF-8”)以解决您的问题。我不确定,但是如果我设置将其保存为“ Charset.forName(“ ASCII”),然后得到您执行的输出。所以看来这应该为您解决问题。
所以只需更改:
String newstr = new String(f.getName().getBytes(Charset.defaultCharset()),"UTF-8");
收件人:
String newstr = new String(f.getName().getBytes(Charset.forName("UTF-8"),"UTF-8");
此外,这不会给您带来变音符号吗?
String newstr = f.getName();
System.out.println(newstr);
如果我理解正确的话,那么一切都会一直保持统一码。当您必须将名称转换为字节流时,就会出现问题。如果您不必这样做,则可以。如果这样做,那么显式使用UTF-8而不是默认字符集,我想你也会很好。
答案 1 :(得分:0)
如果要在文件系统上创建一个名称包含非ASCII字符的文件,则实际上不需要任何转换。
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
new File("ü").createNewFile();
}
}
这实际上将在我的文件系统上创建一个名为“ü”的文件。请注意,我在Linux上,文件名实际上是一个字节序列(在这种情况下,它将是0xC3 0xBC)。操作系统不会将文件名解释为字符串。但是,将像ls
这样的程序。他们将用来解释序列的内容取决于语言环境。
$ LC_ALL=en_US.UTF-8 ls
ü
$ LC_ALL=C ls
''$'\303\274'
还要注意如何确定编码正确性。当您在控制台上输出某些内容时,那里还会有一种编码,如果未正确设置,您可能会得出错误的结论。
答案 2 :(得分:-1)
您需要使用适当的系统属性file.encoding
启动JVM,并将其设置为文件系统中文件名的编码。由于类似UNIX的操作系统上的文件名通常是字节字符串而不是字符串,因此您将不得不尝试正确的文件名:UTF-8
(可能)或ISO-8859-1
(不太可能)。其中之一应该起作用。
该属性的名称未在the official documentation中列出,但是当您列出这些属性时,很容易获得其当前值。
该属性可能需要设置得很早,最好通过-Dfile.encoding=UTF-8
命令行选项进行设置。