我遇到了这个问题,经过几天的搜索和解决方法尝试均未成功。
我现在有一个由 jnlp/webstart 分发的内部 java swing 程序,在 osx 和 windows 计算机上,除其他外,它还从 WebDav 下载一些文件。
最近,在装有 OSX 10.8 和 Java 7 的测试机器上,带有重音字符的文件名和目录名开始被问号替换。
在 Java 7 之前的 OSX 上没有问题。
例子 :
XXXYYY_è_ABCD/
becomes
XXXYYY_?_ABCD/
using java.text.Normalizer(NFD, NFC, NFKD, NFKC) 在原始字符串上,结果不同但仍然错误:
XXXYYY_e?_ABCD/
or
XXXYYY_e_ABCD/
我从 [oracle.com 的 andrew.brygin] 和 [gmail.com 的 mik3hall] 之间的通信中知道
是的,file.encoding 是根据 jvm 运行的语言环境设置的
上,如果您在 xxxx.UTF-8 语言环境中运行 java vm,则
file.encoding应该是UTF-8,设置为MacRoman会有问题。
所以我相信 Oracle/OpenJDK7 行为正确。也就是说,正如安德鲁
Thompson 指出,如果所有以前的 Apple JDK 版本都使用 MacRoman
作为 english/UTF-8 语言环境的 file.encoding,有一个
这里的“兼容性”问题,可能值得在其中添加一些内容
发布说明,供 Oracle/OpenJDK MacOS 用户注意。
原始邮件 http://mail.openjdk.java.net/pipermail/macosx-port-dev/2012-May/004290.html
from 乔尼·萨洛宁 https://stackoverflow.com/users/318758/joni?tab=summary blog (java 和带有无效字符的文件名 http://jonisalonen.com/2012/java-and-file-names-with-invalid-characters/) 我知道 :
您可能知道 Java 使用“默认字符编码”来
将二进制数据转换为字符串。使用其他人读取或写入文本
编码您可以使用InputStreamReader或OutputStreamWriter。但
对于 API 深处的数据到文本转换,您别无选择,只能
更改默认编码。
and
文件编码怎么样?
file.encoding 系统属性也可用于设置默认值
Java 用于 I/O 的字符编码。不幸的是,似乎
对文件名如何解码为字符串没有影响。
从 jnlp 内部执行 locale 总是打印
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
stackoverflow 上最相似的问题及其解决方案是这样的:java-7-os-x 中文件名的编码问题 https://stackoverflow.com/questions/12987252/file-list-retrieves-file-names-with-non-ascii-characters-incorrectly-on-mac-os
但解决方案是将 java 程序的执行包装在脚本中
#!/bin/bash
export LC_CTYPE="UTF-8" # Try other options if this doesn't work
exec java your.program.Here
但由于网络启动,我认为此选项对我不可用,并且我还没有找到任何方法来从程序内设置 LC_CTYPE 环境变量。
有什么解决方案或解决方法吗?
P.S. :
如果我们直接从 shell 运行该程序,即使在 OSX 10+Java 7 上它也能正确写入文件/目录。
仅JNLP+OSX+Java7组合时出现该问题