Java中文件名的编码

Java中文件名的编码,java,encoding,jvm,openjdk,Java,Encoding,Jvm,Openjdk,我正在嵌入式Linux平台上运行一个小型Java应用程序。用OpenJDK替换javavm-JamVM后,带有特殊字符的文件名无法正确存储。像umlauts这样的特殊字符被问号代替 以下是我的测试代码: import java.io.File; import java.io.IOException; public class FilenameEncoding { public static void main (String[] args) {

我正在嵌入式Linux平台上运行一个小型Java应用程序。用OpenJDK替换javavm-JamVM后,带有特殊字符的文件名无法正确存储。像umlauts这样的特殊字符被问号代替

以下是我的测试代码:

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运行VM时,我可以看到系统调用

open("umlaute-???", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0666) = 4
这表明,问题不是文件系统问题,而是虚拟机的问题之一


如何设置文件名的编码?

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

如果没有,则可以将环境变量添加到windows(系统属性->环境变量和要选择新的系统变量下…)名称应为(不带引号)
JAVA\u TOOL\u OPTIONS
,值应设置为
-Dfile.encoding=UTF8
(或者任何编码都可以让你的工作

我通过这篇帖子找到了答案,顺便说一句:

Linux解决方案

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

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

[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的参考资料

这里有一个关于-Dfile.encoding的
您的问题是
javac
希望您的
.java
-文件的编码与您保存的编码不同。编译时
javac
是否警告过您

可能您已经使用编码
ISO-8859-1
windows-1252
保存了它,
javac
需要
UTF-8


使用
-encoding
标志或构建工具的等效标志为
javac
提供正确的编码。

我知道这是一个老问题,但我也遇到了同样的问题。 上述所有解决方案对我都不起作用,但以下解决方案解决了这一问题:

  • 源代码编码为UTF8(maven属性中的project.build.sourceEncoding为UTF-8)
  • 程序参数:-Dfile.encoding=utf8和-Dsun.jnu.encoding=utf8
  • 使用java.nio.file.Path而不是java.io.file

请浏览解释设置编码的链接..设置file.encoding没有帮助。它只影响文件内容,而不影响文件名。这可能会对您有所帮助..您是否检查过底层文件系统是否支持UTF-8?我确信,这不是文件系统问题。我可以在命令行上创建这些文件。另外,另一个VM,JamVM可以正确地创建和处理这样的文件已经包含问号而不是ä、ö和ü。我检查了编译的.class文件中文件名的编码。这是正确的。相同的.class文件在桌面linux上工作,但在嵌入式linux上不工作。你能提供更多关于你正在使用的linux的信息吗?想法是一样的,你只需要将其适应pr启动JVM的Gram/OS。它是运行在ARMV5处理器(Atmel AT91SAM9G20)上的内核2.6.30。一个有趣的事实是,JamVM可以处理这样的文件名,但OpenJDK不能。OpenJDK依赖于什么操作系统功能?更新了我的答案!希望有帮助。你也可以使用输入和输出流,但我认为你的问题是Linux安装的语言不支持你的字符。我只能让我的语言来编写如果我的语言正确,请正确归档。否则我不会得到???(虽然终端显示???),但我会得到:×××阿尔法½