用Java编码文件名

Rol*_*and 9 java openjdk encoding jvm

我在嵌入式Linux平台上运行一个小型Java应用程序.用OpenJDK替换Java VM 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();
                }
        }

}
Run Code Online (Sandbox Code Playgroud)

运行它会提供以下输出:

name = umlaute-???
name in Bytes: 75 6d 6c 61 75 74 65 2d 3f 3f 3f
Run Code Online (Sandbox Code Playgroud)

和文件称为umlaute - ??? 被建造.

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

使用strace运行VM,我可以看到系统调用

open("umlaute-???", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0666) = 4
Run Code Online (Sandbox Code Playgroud)

这表明问题不是文件系统问题,而是其中一个VM.

如何设置文件名的编码?

You*_* G. 4

如果您使用的是 Eclipse,则可以转到 Window->Preferences->General->Workspace,然后从下拉菜单中选择所需的“文本文件编码”选项。通过改变我的周围,我能够重新创建你的问题(并且也改变回修复)。

\n\n

如果不是,那么您可以向 Windows 添加环境变量(系统属性 -> 环境变量,并在系统变量下选择新建...)名称应为(不带引号)JAVA_TOOL_OPTIONS,值应设置为-Dfile.encoding=UTF8(或任何编码可以让你的工作。

\n\n

我通过这篇文章找到了答案,顺便说一句:\n设置默认的Java字符编码?

\n\n

Linux解决方案

\n\n

-(永久)env | grep LANG在终端中使用将为您提供一两个关于 linux 当前设置的编码的响应。然后,您可以在 /etc/sysconfig i18n 文件中将 LANG 设置为 UTF8(您的可能设置为 ASCII)(我在 2.6.40 fedora 上对此进行了测试)。基本上,我从 UTF8(其中有奇怪的字符)切换到 ASCII(其中有问号)并返回。

\n\n

-(在运行 JVM 时,但可能无法解决问题)您可以使用 java -Dfile.encoding=**** FilenameEncoding 以所需的编码启动 JVM\n以下是两种方式的输出:

\n\n
[youssef@JoeLaptop bin]$ java -Dfile.encoding=UTF8 FilenameEncoding\n\nname = umlaute-\xd7\x94\xd7\xa6\xef\xbf\xbd\nname in Bytes: 75 6d 6c 61 75 74 65 2d d7 94 d7 a6 ef bf bd \nUTF-8\nUTF8\n\n[youssef@JoeLaptop bin]$ java FilenameEncoding\n\nname = umlaute-???????\nname in Bytes: 75 6d 6c 61 75 74 65 2d 3f 3f 3f 3f 3f 3f 3f \nUS-ASCII\nASCII\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里有一些关于 Linux 的参考资料\n http://www.cyberciti.biz/faq/set-environment-variable-linux/

\n\n

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

\n