10

我在嵌入式 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

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

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

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

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

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

如何设置文件名的编码?

4

3 回答 3

4

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

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

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

Linux 解决方案

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

-(关于运行 JVM,但可能无法解决问题)您可以使用 java -Dfile.encoding=**** FilenameEncoding 以您想要的编码启动 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 的一些参考资料 http://www.cyberciti.biz/faq/set-environment-variable-linux/

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

于 2012-04-11T13:51:37.817 回答
2

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

  • 源编码为 UTF8(在 Maven 属性中 project.build.sourceEncoding 为 UTF-8)
  • 程序参数:-Dfile.encoding=utf8 和 -Dsun.jnu.encoding=utf8
  • 使用 java.nio.file.Path 而不是 java.io.File
于 2017-06-17T11:15:57.857 回答
0

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

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

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

于 2012-04-12T15:19:50.197 回答