在Java中的文件名的编码(Encoding of file names in Java)

2019-07-28 22:16发布

我运行嵌入式Linux平台上的一个小的Java应用程序。 与OpenJDK的替代Java虚拟机JamVM后,有特殊字符的文件名不正确保存。 特殊字符,如变音符号被替换为问号。

这里是我的测试代码:

import java.io.File;
import java.io.IOException;

public class FilenameEncoding
{

        public static void main (String[] args) {
                String name = "umlaute-äöü";
                System.out.println("\nname = " + name);
                System.out.print("name in Bytes: ");
                for (byte b : name.getBytes()) {
                        System.out.print(Integer.toHexString(b & 255) + " ");
                }
                System.out.println();

                try {
                        File f = new File(name);
                        f.createNewFile();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }

}

运行它提供了以下的输出:

name = umlaute-???
name in Bytes: 75 6d 6c 61 75 74 65 2d 3f 3f 3f

和文件名为umlaute - ??? 被建造。

设置属性的file.encoding和sun.jnu.encoding为UTF-8给出了在终端正确的字符串,但所创建的文件仍然是umlaute - ???

与strace的运行虚拟机,我可以看到系统调用

open("umlaute-???", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0666) = 4

这说明,这个问题是不是文件系统的问题,但虚拟机之一。

如何可以将文件名的编码设置?

Answer 1:

如果您使用的是Eclipse,那么你可以去窗口 - >首选项 - >常规 - >工作区,并选择您从下拉菜单中选择所需的“文本文件编码”选项。 通过围绕改变我的,我是能够重新创建您的问题(也变回修复)。

如果你没有,那么你可以将环境变量添加到Windows(系统属性- >环境变量和下要选择新的系统变量...)的名称应为(不带引号) JAVA_TOOL_OPTIONS和值应设置为-Dfile.encoding=UTF8 (或其他编码会得到你的工作。

我找到了答案,通过这个帖子,顺便说一句: 设置默认的Java字符编码?

Linux解决方案

- (永久)使用env | grep LANG env | grep LANG终端会给你一个或两个响应回到什么编码linux是目前设置有。 然后,您可以将LANG设置为UTF8在/ etc / SYSCONFIG的i18n文件(你可能会设置为ASCII)(我测试了这个在2.6.40的Fedora)。 Bascially,我从UTF8转换(在那里我有奇怪的字符)到ASCII(在那里我有问号)和背部。

- (上运行的JVM,但可能不会解决问题),你可以用你想用java -Dfile.encoding编码启动JVM = **** FilenameEncoding下面是从两个方面的输出:

[youssef@JoeLaptop bin]$ java -Dfile.encoding=UTF8 FilenameEncoding

name = umlaute-הצ�
name in Bytes: 75 6d 6c 61 75 74 65 2d d7 94 d7 a6 ef bf bd 
UTF-8
UTF8

[youssef@JoeLaptop bin]$ java FilenameEncoding

name = umlaute-???????
name in Bytes: 75 6d 6c 61 75 74 65 2d 3f 3f 3f 3f 3f 3f 3f 
US-ASCII
ASCII

下面是Linux的东西一定的参考http://www.cyberciti.biz/faq/set-environment-variable-linux/

这里是一个关于-Dfile.encoding 设置默认的Java字符编码?



Answer 2:

我知道这是一个老问题,但我有同样的问题。 所有提到的解决方案并没有为我工作,但下面解决它:

  • 源编码为UTF8(project.build.sourceEncoding到UTF8在行家特性)
  • 程序参数:-Dfile.encoding = UTF8和-Dsun.jnu.encoding = UTF8
  • 使用java.nio.file.Path代替的java.io.File


Answer 3:

你的问题是, javac期待您的不同编码.java -file比你救了它。 没有javac警告你编译?

也许你已经用编码保存它ISO-8859-1windows-1252 ,和javac期待UTF-8

提供正确编码javac-encoding标志,或相当于为您的构建工具。



文章来源: Encoding of file names in Java