通过Java创建时Linux上的文件名编码问题
我有一个问题,我已经被它困扰了很长一段时间了。问题是,我不能让文件名支持特殊字符(只有文件名,文件内容可以)。文件名不是用问号创建的,而是用问号创建的 现在,据我所知(我很可能遗漏了一些非常明显的东西),Linux本身设置正确。Locale命令将打印出以下内容,我认为这很好:通过Java创建时Linux上的文件名编码问题,java,linux,encoding,Java,Linux,Encoding,我有一个问题,我已经被它困扰了很长一段时间了。问题是,我不能让文件名支持特殊字符(只有文件名,文件内容可以)。文件名不是用问号创建的,而是用问号创建的 现在,据我所知(我很可能遗漏了一些非常明显的东西),Linux本身设置正确。Locale命令将打印出以下内容,我认为这很好: LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_C
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
这是我为测试目的编写的Java代码。并不是所有的东西都能让事情变得清晰(比如最后一块),但所有重要的东西都是。我还尝试了使用BufferedOutputStream对主题进行修改,但结果是一样的
String exampleString="I'm in the file: \u0160 \u0161 \u010C \u010D";
String filename="I'm the filename \u0160\u0161\u010C\u010D.txt";
FileOutputStream fos = null;
InputStream is = null;
try {
fos = new FileOutputStream(transferDir.getPath()
+ File.separator + "_"
+ filename);
is = new ByteArrayInputStream(exampleString.getBytes(StandardCharsets.UTF_8));
byte[] buffer = new byte[4096];
int counter;
while ((counter = is.read(buffer)) != -1) {
fos.write(buffer, 0, counter);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
我也尝试过用file.encoding和sun.jnu.encoding属性启动程序,但没有任何改变
我开始怀疑真相是否真的存在,所以任何帮助都将不胜感激 您从哪里可以看到文件名中的问号?这可能是因为您试图在其中执行ls-l(或其他任何操作)的控制台没有适当渲染外来字符的glyph
创建这样的文件后,请尝试使用预期的名称和带问号的名称打开该文件。您很快就会知道名称本身是否真的在文件创建过程中出错。好吧,这似乎是旧文件API中的一个长期错误。通过切换到较新的java.nio包,我已经解决了所有问题-没有任何类型的额外配置-您确定创建的文件名中包含问号吗?还是只有您的终端无法显示字符?请包括您想要的名称。(
fos.close()
called?)尝试将File.listFiles(…)
转储到文件中进行分析。我尽可能确定。例如,如果我使用浏览器应用程序列出这些文件,因此没有使用Putty或WinSCP(设置为显示UTF-8),问号仍然存在。例如,“我在文件名中:šŠŠŠŠŠŠŠŠŠŠŠŠŠŠ35。列出文件还将显示问号,例如:07:46:05367调试目录lib64 07:46:05367调试文件alfresco.log.2015-03-13 07:46:05367调试文件alfresco.log.2015-04-20 07:46:05367调试文件\u test???.txt 07:46:05367调试目录srv 07:46:05367调试目录cgroup
我正在使用Putty和WinSCP,这两个都是通过支持UTF-8进行设置的。这是一个好主意,但我确保不会犯这个错误。不过谢谢你的主意。