aauggogogo您好:
我想您是由Windows環境將中文檔名的檔案上傳到Solaris的檔案系統,然後看到上傳的檔名變成??的樣子吧?
由於我目前手邊沒有Solaris 10的環境,所以我改用Linux環境的經驗來說明,供您參考:
首先,參考這篇文章
JVM and OS System Properties,將下列的程式碼編譯成SysProperties.class
SysProperties.java:
import java.util.Properties;
public class SysProperties {
public static void main(String[] args) {
Properties sysProps = System.getProperties();
sysProps.list(System.out);
}
}
然後執行
java SysProperties
可以得到類似下面的輸出
Windows:
-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=C:\Program Files\Java\jdk1.6.0_23\jre...
java.vm.version=19.0-b09
java.vm.vendor=Sun Microsystems Inc.
java.vendor.url=http://java.sun.com/
path.separator=;
java.vm.name=Java HotSpot(TM) Client VM
file.encoding.pkg=sun.io
user.country=TW
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=Service Pack 3
java.vm.specification.name=Java Virtual Machine Specification
user.dir=D:\workspace\test
java.runtime.version=1.6.0_23-b05
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=C:\Program Files\Java\jdk1.6.0_23\jre...
os.arch=x86
java.io.tmpdir=C:\DOCUME~1\user\LOCALS~1\Temp\
line.separator=
java.vm.specification.vendor=Sun Microsystems Inc.
user.variant=
os.name=Windows XP
sun.jnu.encoding=MS950
java.library.path=C:\Program Files\Java\jdk1.6.0_23\bin...
java.specification.name=Java Platform API Specification
java.class.version=50.0
sun.management.compiler=HotSpot Client Compiler
os.version=5.1
user.home=C:\Documents and Settings\user
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=MS950
java.specification.version=1.6
user.name=andowson
java.class.path=D:\workspace\test\bin
java.vm.specification.version=1.0
sun.arch.data.model=32
java.home=C:\Program Files\Java\jdk1.6.0_23\jre
java.specification.vendor=Sun Microsystems Inc.
user.language=zh
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode, sharing
java.version=1.6.0_23
java.ext.dirs=C:\Program Files\Java\jdk1.6.0_23\jre...
sun.boot.class.path=C:\Program Files\Java\jdk1.6.0_23\jre...
java.vendor=Sun Microsystems Inc.
file.separator=\
java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport...
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=pentium_pro+mmx pentium_pro pentium+m...
Linux:
[andowson@scm ~]$ java SysProperties
-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=/usr/java/jdk1.6.0_23/jre/lib/i386
java.vm.version=19.0-b09
java.vm.vendor=Sun Microsystems Inc.
java.vendor.url=http://java.sun.com/
path.separator=:
java.vm.name=Java HotSpot(TM) Server VM
file.encoding.pkg=sun.io
user.country=TW
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=unknown
java.vm.specification.name=Java Virtual Machine Specification
user.dir=/home/andowson
java.runtime.version=1.6.0_23-b05
java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment
java.endorsed.dirs=/usr/java/jdk1.6.0_23/jre/lib/endorsed
os.arch=i386
java.io.tmpdir=/tmp
line.separator=
java.vm.specification.vendor=Sun Microsystems Inc.
os.name=Linux
sun.jnu.encoding=UTF-8
java.library.path=/usr/java/jdk1.6.0_23/jre/lib/i386/se...
java.specification.name=Java Platform API Specification
java.class.version=50.0
sun.management.compiler=HotSpot Tiered Compilers
os.version=2.6.18-194.11.1.el5
user.home=/home/andowson
user.timezone=
java.awt.printerjob=sun.print.PSPrinterJob
file.encoding=UTF-8
java.specification.version=1.6
user.name=andowson
java.class.path=.
java.vm.specification.version=1.0
sun.arch.data.model=32
java.home=/usr/java/jdk1.6.0_23/jre
java.specification.vendor=Sun Microsystems Inc.
user.language=zh
java.vm.info=mixed mode
java.version=1.6.0_23
java.ext.dirs=/usr/java/jdk1.6.0_23/jre/lib/ext:/us...
sun.boot.class.path=/usr/java/jdk1.6.0_23/jre/lib/resourc...
java.vendor=Sun Microsystems Inc.
file.separator=/
java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport...
sun.cpu.endian=little
sun.io.unicode.en
然後觀察file.encoding這個系統屬性的值,可以發現在Windows上是MS950,在Linux上是UTF-8,也就是說JVM預設的編碼將會採用MS950和UTF-8來處理檔案的I/O。故通常都會出現一些錯誤訊息,例如File Not Found或寫檔時,檔名看到一堆??和亂碼。
解決的方法:
目前我是將Linux的預設編碼改為Big5,修改/etc/sysconfig/i18n(
需要重開機reboot OS):
LANG="zh_TW.Big5"
另外一種方式(沒試過請自行確認)是啟動JVM時加上-Dfile.encoding=MS950或-Dfile.encoding=Big5
參考資料:
http://stackoverflow.com/questions/361975/setting-the-default-java-character-encoding