我正在嵌入式 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
和名为 umlaut-??? 的文件被建造。
将属性 file.encoding 和 sun.jnu.encoding 设置为 UTF-8 可在终端中提供正确的字符串,但创建的文件仍然是变音 -???
使用 strace 运行虚拟机,我可以看到系统调用
open("umlaute-???", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0666) = 4
这表明问题不是文件系统的问题,而是VM的问题。
文件名的编码如何设置?
如果您使用的是 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=**** 文件名编码以所需的编码启动 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字符编码?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)