用Java编码文件名

我在嵌入式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会在终端中提供正确的字符串,但创建的文件仍然是变形 – ???

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

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

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

如何设置文件名的编码?

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

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

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

Linux解决方案

– (永久)使用env | grep LANG 终端中的env | grep LANG将为您提供一个或两个回复,说明当前设置的linux编码。 然后,您可以在/ etc / sysconfig i18n文件中将LANG设置为UTF8(您的设置可能设置为ASCII)(我在2.6.40 fedora上测试过)。 基本上,我从UTF8(我有奇怪的字符)切换到ASCII(我有问号)和返回。

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

 [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字符编码?

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

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

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

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

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