【发布时间】:2012-04-23 18:30:29
【问题描述】:
我正在嵌入式 Linux 平台上运行一个小型 Java 应用程序。将 Java VM JamVM 替换为 OpenJDK 后,带有特殊字符的文件名无法正确存储。变音符号等特殊字符被问号替换。
这是我的测试代码:
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
还有一个叫做变音符号的文件-???已创建。
将属性 file.encoding 和 sun.jnu.encoding 设置为 UTF-8 会在终端中提供正确的字符串,但创建的文件仍然是变音符号-???
用strace运行虚拟机,可以看到系统调用
open("umlaute-???", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0666) = 4
这表明问题不是文件系统问题,而是虚拟机之一。
文件名的编码如何设置?
【问题讨论】:
-
请浏览解释设置编码的链接。stackoverflow.com/questions/361975/…
-
设置 file.encoding 没有帮助。它只影响文件内容,不影响文件名。
-
这可能对您有所帮助.. stackoverflow.com/questions/1184176/…
-
你检查过底层文件系统甚至支持 UTF-8 吗?
-
我敢肯定,这不是文件系统问题。我可以在命令行上创建这些文件。此外,另一个虚拟机 JamVM 可以正确创建和处理此类文件。 strace 显示,对 open() 的调用已经包含问号,而不是 ä、ö 和 ü。