用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-1
或windows-1252
编码保存了它, javac
期待UTF-8
。
使用-encoding标志或构建工具的等效标记为javac
提供正确的编码。