2012-02-08 90 views
2

我有一个定义的编码(utf8)输入文件,从中创建不同的文件,其名称和内容(同样是utf8)从输入文件中获取。设置文件名编码

我的问题是,一个特定的Windows系统,创建的文件没有正确的字符。这些文件的内容是完全可读的,但它们的名字不是。 而不是Ü.xml,该文件的名称为├£.xml

在其他Windows系统上一切正常。

文件内容的编码可以在OutputStreamWriter的第二个参数中设置,但文件名的编码不能在new File(name)中设置。

谢谢。

+0

如果您手动将'Ü.xml'复制到该Windows系统,会发生什么?两个系统上的JVM的默认编码是什么? – Thomas 2012-02-08 16:07:27

+0

手动复制工作。 'System.getProperty(“file.encoding”)'在两者上都是“Cp1252”。 – stracktracer 2012-02-13 08:23:49

+0

感谢您的反馈。事实证明这个问题是一个maven问题,因为这些文件是由java执行正确生成的,但只有当maven将它们打包成jar时,问题就在那里。请参阅:http://stackoverflow.com/questions/9258347/file-name-encoding-in-jar – stracktracer 2012-02-13 09:44:46

回答

2

看到两个字符,应该有一个UTF-8多字节字符ü。 Windows似乎没有将UTF-8作为文件编码。并且一个UTF-8文件被复制到该系统上,就像解压zip文件一样。

System.getProperty("file.encoding")应该给平台编码。也许,远程可以想象,这是一些奇怪的情况没有被Java和Resp覆盖。 Windows,就像压缩目录一样,或者是第二个外部磁盘,它们使用非UTF-8功能的文件系统格式化。

+0

谢谢您的回应。两个系统上的file.encoding都是“Cp1252”。 – stracktracer 2012-02-13 08:21:59

+0

文件是如何创建的?手动应该没有错。在Java中,可能有两个错误:可以在IDE中设置源编码,编译器也可以使用编码参数化:'javac -encoding Cp1252 ...'。 – 2012-02-13 09:08:24

2

Java使用“平台的默认字符集”将文件名转换为字符串,并且无法通过标准API更改该行为。您可能,在一些系统,可以更改默认的编码,当你启动JVM:

java -Dfile.encoding=cp1252 package.ClassName 

在其他系统上,只有这样才能影响到文件名编码是通过系统区域设置。你可以在这里阅读更多关于:http://jonisalonen.com/2012/java-and-file-names-with-invalid-characters/