编码-将US-ASCII转换为UTF-8?

时间:2019-02-27 01:52:48

标签: java

我在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

3 个答案:

答案 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命令行选项进行设置。