注意:所以最后我认为我已经确定了。
我不确定这是正确的。但是通过一些代码阅读和测试,这就是我发现的内容,而且我没有更多时间研究它。如果有人有兴趣,他们可以检查一下,并确定这个答案是对还是错-
我会很高兴:)
我使用的参考资料来自OpenJDK的站点上的以下压缩包: openjdk-6-src-b25-01_may_2012.tar.gz
Java通过以下方法将所有字符串本地转换为平台的本地编码
jdk/src/share/native/common/jni_util.c - JNU_GetStringPlatformChars()
。系统属性sun.jnu.encoding
用于确定平台的编码。的值
sun.jnu.encoding
是jdk/src/solaris/native/java/lang/java_props_md.c - GetJavaProperties()
使用setlocale()
libc的方法设置的。环境变量LC_ALL
用于设置的值sun.jnu.encoding
。在命令提示符下使用-Dsun.jnu.encoding
Java选项使用Java 给出的值将被忽略。呼叫
File.exists()
已被编码在文件中jdk/src/share/classes/java/io/File.java
,并且返回为
return ((fs.getBooleanAttributes(this) & FileSystem.BA_EXISTS) != 0);
getBooleanAttributes()
是jdk/src/share/native/java/io/UnixFileSystem_md.c
在函数中的 本地编码(并且我跳过了浏览许多文件的代码的步骤)Java_java_io_UnixFileSystem_getBooleanAttributes0()
。此处,宏WITH_FIELD_PLATFORM_STRING(env, file, ids.path, path)
将路径字符串转换为平台的编码。因此,转换为错误的编码实际上会将错误的C字符串(char数组)发送给随后的
stat()
方法调用。它将返回结果,找不到文件。
LESSON:
LC_ALL非常重要



