我无法理解IBM JVM java.io.File在JFS2文件系统上在AIX上执行UTF-8交易的方式.我怀疑有一个我忽略的系统属性,但我还没有找到它.
假设我有一个名为othér(其中é是U + 00E9或UTF-8字节0xc3 0xa9)的文件.文件名以UTF-8编码,由C程序创建:
char filename[] = { 'o', 't', 'h', 0xc3, 0xa9, 'r', 0 };
open(filename, O_RDWR|O_CREAT, 0666);
Run Code Online (Sandbox Code Playgroud)
如果我在Java中创建一个代表文件名的Unicode字符串,则无法打开它.此外,如果我File.listFiles()在Java中使用它,它坚持将其视为Latin1字符串.例如:
String expectedName = new String(new char[] { 'o', 't', 'h', 0xe9, 'r' });
File expected = new File(expectedName);
if (expected.exists())
System.out.println(expectedName + " exists");
else
System.out.println(expectedName + " DOES NOT exist");
for (File child : new File(".").listFiles())
{
System.out.println(child.getName());
System.out.print("Chars:");
for (char c : child.getName().toCharArray())
System.out.print(" 0x" + Integer.toHexString((int)c));
System.out.println();
}
Run Code Online (Sandbox Code Playgroud)
该计划的结果是:
% java -Dfile.encoding=UTF8 FileTest
othér DOES NOT exist
othér
Chars: 0x6f 0x74 0x68 0xc3 0xa9 0x72
Run Code Online (Sandbox Code Playgroud)
所以看来我的文件名被视为Latin1.我已经尝试将file.encoding系统属性设置为UTF8和client.encoding.override系统属性UTF-8无效.我LANG和LC_ALL设置是en_US.UTF-8:
% echo $LANG
en_US.UTF-8
% echo $LC_ALL
en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)
由SMIT配置的我的系统的"主要语言环境"是"ISO8859-1".我真的不知道这个设置的全部影响,但我无法改变它.我怀疑,如果我可以将其更改为"UTF8英语",那么这可能会解决问题,但由于JFS2以Unicode格式存储文件名,而Java在内部以Unicode运行,我觉得应该有一个更通用的解决方案.
我可以设置J9的另一个系统属性,它会强制它使用UTF-8文件名,而不管我的SMIT设置如何?
AIX版本为5.2,Java版本为IBM J9(1.5.0),文件系统为JFS2:
rs6000% uname -a
AIX rs6000 2 5 000A9B7C4C00
rs6000% java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pap32dev-20091106a (SR11 ))
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 AIX ppc-32 j9vmap3223-20091104 (JIT enabled)
J9VM - 20091103_45935_bHdSMr
JIT - 20091016_1845_r8
GC - 20091026_AA)
JCL - 20091106
rs6000% mount|grep /home
/dev/hd1 /home jfs2 Jun 27 16:02 rw,log=/dev/hd8
Run Code Online (Sandbox Code Playgroud)
更新:这仍然发生在Java6上:
% java -version
java version "1.6.0"
Java(TM) SE Runtime Environment (build pap3260sr11-20120806_01(SR11))
IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 AIX ppc-32 jvmap3260sr11-20120801_118201 (JIT enabled, AOT enabled)
J9VM - 20120801_118201
JIT - r9_20120608_24176ifx1
GC - 20120516_AA)
JCL - 20120713_01
Run Code Online (Sandbox Code Playgroud)
我找到了答案。我真的很想在这里提供帮助。
尝试使用设置的标志运行您的程序-Dsun.jnu.encoding=UTF-8。
| 归档时间: |
|
| 查看次数: |
4675 次 |
| 最近记录: |