linux下File.createNewFile(“中文文件名”) 亂碼問題


記錄一個亂碼問題

  1. java源文件中的中文字符會以 文本文件的編碼進行保存
  2. 編譯的時候如果不指定編碼格式,jdk默認使用當前系統平台字符集進行編譯,
    所以javac編譯要指定編碼格式跟源文件保存時的編碼一致。




以下是問題回放:

http://www.iteye.com/problems/80104

我今天遇到了一個中文亂碼的問題,雖然現在貌似解決了,但我想了很久沒想明白。希望大家幫我支支招,讓我搞明白這是啥原因。

 

我的疑問是

我的java我的java源文件是用utf-8保存的

在solaris機器上也是用utf-8進行編譯的

為什么執行的時候

String newp = new String(path.getBytes("utf-8"),encoding)

生成的文件名反而是亂碼

 

改成

String newp = new String(path.getBytes("gbk"),encoding)

就能顯示正常的中文?

 

為什么?這個gbk是從哪來的?

 

太郁悶了,大家有知道的請告訴我,感謝!

 

代碼如下

 

 

Java代碼   收藏代碼


 

 

 

代碼的文件編碼 在eclipse里面選的是utf-8



 

然后我將該文件ftp傳到solaris機器上

 

查看solaris機器上jdk的版本

$ java -version

java version "1.5.0"

Java(TM) 2 Runtime Environment, Standard Edition (build pap64dev-20100813 (SR12 FP1 ))

IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 AIX ppc64-64 j9vmap6423-20100808 (JIT enabled)

J9VM - 20100629_60535_BHdSMr

JIT  - 20100623_16197_r8

GC   - 20100211_AA)

JCL  - 20100813

 

 

 

 

$ locale

LANG="zh_CN.UTF-8"

LC_COLLATE="C"

LC_CTYPE="C"

LC_MONETARY="C"

LC_NUMERIC="C"

LC_TIME="C"

LC_MESSAGES="C"

LC_ALL=

$

 

 

指定utf-8 對源文件進行編譯

 

$ javac -encoding utf-8 FileTest.java

 

 

 

用javap查看一下

$ javap -verbose FileTest

Compiled from "FileTest.java"

public class FileTest extends java.lang.Object

  SourceFile: "FileTest.java"

  minor version: 0

  major version: 49

  Constant pool:

const #1 = Method       #29.#40;        //  java/lang/Object."<init>":()V

const #2 = Method       #41.#42;        //  java/lang/System.getProperties:()Ljava/util/Properties;

const #3 = Field        #41.#43;        //  java/lang/System.out:Ljava/io/PrintStream;

const #4 = Method       #44.#45;        //  java/util/Properties.list:(Ljava/io/PrintStream;)V

const #5 = String       #46;    //  ******************

const #6 = Method       #47.#48;        //  java/io/PrintStream.println:(Ljava/lang/String;)V

const #7 = String       #49;    //  file.encoding

const #8 = Method       #41.#50;        //  java/lang/System.getProperty:(Ljava/lang/String;)Ljava/lang/String;

const #9 = class        #51;    //  java/lang/StringBuilder

const #10 = Method      #9.#40; //  java/lang/StringBuilder."<init>":()V

const #11 = String      #52;    //  encoding:

const #12 = Method      #9.#53; //  java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

const #13 = Method      #9.#54; //  java/lang/StringBuilder.toString:()Ljava/lang/String;

const #14 = String      #55;    //  ./?haha?AAA??.txt

const #15 = class       #56;    //  java/lang/String

const #16 = String      #57;    //  gbk

const #46 = Asciz       ******************;

const #47 = class       #79;    //  java/io/PrintStream

const #48 = NameAndType #80:#81;//  println:(Ljava/lang/String;)V

const #49 = Asciz       file.encoding;

const #50 = NameAndType #82:#83;//  getProperty:(Ljava/lang/String;)Ljava/lang/String;

public FileTest();

  Code:

   Stack=1, Locals=1, Args_size=1

   0:   aload_0

   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V

   4:   return

  LineNumberTable:

   line 6: 0

 

public static void main(java.lang.String[])   throws java.lang.InterruptedException;

  Code:

   Stack=4, Locals=6, Args_size=1

   12:  ldc     #5; //String ******************

   14:  invokevirtual   #6; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

   17:  ldc     #7; //String file.encoding

   19:  invokestatic    #8; //Method java/lang/System.getProperty:(Ljava/lang/String;)Ljava/lang/String;

   22:  astore_1

   23:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;

   26:  new     #9; //class java/lang/StringBuilder

   29:  dup

   30:  invokespecial   #10; //Method java/lang/StringBuilder."<init>":()V

   33:  ldc     #11; //String encoding:

   35:  invokevirtual   #12; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

   38:  aload_1

   39:  invokevirtual   #12; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

   42:  invokevirtual   #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;

   45:  invokevirtual   #6; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

   48:  ldc     #14; //String ./?haha?AAA??.txt

   50:  astore_2

   51:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;

   54:  aload_2

   55:  invokevirtual   #6; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

   58:  new     #15; //class java/lang/String

   61:  dup

   62:  aload_2

   63:  ldc     #16; //String gbk

   65:  invokevirtual   #17; //Method java/lang/String.getBytes:(Ljava/lang/String;)[B

   68:  aload_1

   69:  invokespecial   #18; //Method java/lang/String."<init>":([BLjava/lang/String;)V

  // 太長顯示不了,刪除掉

 

}

 

運行代碼 注意 我未指定 –Dfile.encoding=”utf-8”

而是默認 iso8859-1

$ java FileTest.

The java class is not found:  FileTest.

$ java FileTest

-- listing properties --

java.assistive=ON

java.runtime.name=Java(TM) 2 Runtime Environment, Stand...

ibm.signalhandling.rs=false

sun.boot.library.path=/usr/java5_64/jre/bin

java.vm.version=2.3

com.ibm.oti.configuration=scar

java.vm.vendor=IBM Corporation

java.vendor.url=http://www.ibm.com/

path.separator=:

java.vm.name=IBM J9 VM

user.country=US

java.vm.specification.name=Java Virtual Machine Specification

user.dir=/data/zhjk/ISS_HOME/data/test-ouy

java.runtime.version=pap64dev-20100813 (SR12 FP1 )

java.fullversion=J2RE 1.5.0 IBM J9 2.3 AIX ppc64-64 j9...

java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment

os.arch=ppc64

com.ibm.vm.bitmode=64

java.io.tmpdir=/tmp/

com.ibm.util.extralibs.properties=

line.separator=

 

java.vm.specification.vendor=Sun Microsystems Inc.

user.variant=

java.awt.fonts=

os.name=AIX

sun.java2d.fontpath=

java.jcl.version=20100813

sun.jnu.encoding=ISO8859-1

java.library.path=/usr/java5_64/jre/bin:/usr/java5_64/j...

jxe.current.romimage.version=9

com.ibm.oti.vm.bootstrap.library.path=/usr/java5_64/jre/bin

com.ibm.cpu.endian=big

java.specification.name=Java Platform API Specification

java.class.version=49.0

ibm.system.encoding=ISO8859-1

invokedviajava=

java.util.prefs.PreferencesFactory=java.util.prefs.FileSystemPreferences...

os.version=6.1

com.ibm.oti.vm.library.version=23

user.home=/data/zhjk

user.timezone=

java.awt.printerjob=sun.print.PSPrinterJob

java.specification.version=1.5

file.encoding=ISO8859-1

java.class.path=.

user.name=iss

java.vm.specification.version=1.0

java.home=/usr/java5_64/jre

sun.arch.data.model=64

java.specification.vendor=Sun Microsystems Inc.

ibm.signalhandling.sigint=true

user.language=en

com.ibm.oti.jcl.build=20100528_1023

java.vm.info=J2RE 1.5.0 IBM J9 2.3 AIX ppc64-64 j9...

java.version=1.5.0

java.ext.dirs=/usr/java5_64/jre/lib/ext

sun.boot.class.path=/usr/java5_64/jre/lib/vm.jar:/usr/jav...

jxe.lowest.romimage.version=9

java.vendor=IBM Corporation

file.separator=/

java.compiler=j9jit23

sun.io.unicode.encoding=UnicodeBig

ibm.signalhandling.sigchain=true

******************

encoding:ISO8859-1

./?haha?AAA??.txt

./哈haha哈AAA瓔玥.txt

file create:true

$

 

 

結果 生成的文件名是中文的 ok



 



------------------------------------------------------------------------------------------------------------------
問題補充:
chen_yongkai 寫道
你開發和編譯的機器的系統編碼是GBK吧


我是在Windows xp的環境下編寫的java文件
文件保存格式在eclipse里面設置的是 utf-8

------------------------------------------------------------------------------------------------------------------
問題補充:
chen_yongkai 寫道

直接用
Java代碼   收藏代碼
  1. File file = new File("./哈haha哈AAA瓔玥.txt"  
  2. );     
  3.             boolean b = file.createNewFile();     
應該就可以了


直接用是亂碼,我想你沒有完整看完我的問題
亂碼問題我已經解決了,但我想知道原因

------------------------------------------------------------------------------------------------------------------
問題補充:
chen_yongkai 寫道
不行再試試用native2ascii

C:\Users\j>native2ascii
中文文件名
\u4e2d\u6587\u6587\u4ef6\u540d

Java代碼   收藏代碼
  1. File file = new File("./\u4e2d\u6587\u6587\u4ef6\u540d  
  2. .txt");        
  3.             boolean b = file.createNewFile();       


剛試了 不行

亂碼問題我已經解決了,但我想知道 原因



采納的答案

2012-03-14 guazi (中級程序員)

你是用的ssh到linux去執行編譯的吧,這個ssh客戶端也是有編碼指定的,應該是你的這個編碼和系統不一致導致的。如果你在編譯的時候不指定編碼的話,生成的文件名應該有問題吧。

提問者對於答案的評價:
非常感謝!

我用的是winscp 剛查看了一下選項 utf-8 是auto我改成on

然后試了一次 問題解決了 就是winscp的原因

很感謝你


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM