用Java编码文件名

时间:2012-04-11 12:45:10

标签: java encoding jvm openjdk

我在嵌入式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();
                }
        }

}

运行它会提供以下输出:

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

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

如何设置文件名的编码?

3 个答案:

答案 0 :(得分:4)

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

如果不是,那么你可以向windows添加一个环境变量(系统属性 - >环境变量和你想要选择New ...的系统变量下)。名称应该是(不带引号){{1}并且值应该设置为JAVA_TOOL_OPTIONS(或者任何编码都可以使你的工作。

我通过这篇文章找到了答案,顺便说一下: Setting the default Java character encoding?

Linux解决方案

- (永久)在终端中使用-Dfile.encoding=UTF8会给你一个或两个回复,说明当前设置的linux编码。然后,您可以在/ etc / sysconfig i18n文件中将LANG设置为UTF8(您的设置可能设置为ASCII)(我在2.6.40 fedora上测试过)。基本上,我从UTF8(我有奇怪的字符)切换到ASCII(我有问号),然后回来。

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

env | grep LANG

以下是linux内容的一些参考资料 http://www.cyberciti.biz/faq/set-environment-variable-linux/

以下是关于-Dfile.encoding的内容 Setting the default Java character encoding?

答案 1 :(得分:1)

我知道这是一个老问题,但我遇到了同样的问题。 所有提到的解决方案都不适合我,但以下解决了它:

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

答案 2 :(得分:0)

您的问题是javac期望.java - 文件的编码与您保存的文件不同。你编译时没有javac警告你吗?

也许您已使用编码ISO-8859-1windows-1252保存,javac期待UTF-8

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