我遇到了问题,而且我已经坚持了很长一段时间了。问题是,我无法获取文件名来支持特殊字符(只有文件名,文件内容没问题)。而不是它们,文件名是用问号创建的。
现在,据我所知(我很可能会遗漏一些非常明显的东西),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_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 属性启动该程序,但这没有任何改变。
我开始质疑真相是否真的存在,所以任何帮助都会受到赞赏。
答案 0 :(得分:0)
你在哪里可以看到文件名中的问号?可能是您尝试执行ls -l(或其他)的控制台根本没有字形来正确渲染您的异域角色。
创建此类文件后,尝试使用预期的名称和带有问号的名称打开它。您很快就会知道在创建文件期间名称本身是否真的搞砸了。
答案 1 :(得分:0)
好吧,看来这是旧版File API中的一个长期存在的错误。我已经解决了所有问题 - 没有任何额外的配置 - 切换到更新的java.nio包。