程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java語言中字符的處理

Java語言中字符的處理

編輯:關於JAVA

----Java是一種編程語言、一個運行系統、一套開發工具和一個應用程序編程界面(API)。Java建立在C++的熟悉、有用的特征之上,而取消了C++的復雜的、危險的和多余的元素。它是一個更安全、更簡單、更容易使用的語言。

1、Java的字符表達

----Java語言和C語言對字符進行了互不相同的描述,Java使用16位的Unicode字符集(該標准描述了許多語言的各種不同字符),因此Java字符是一個16位的無符號整數,字符變量用來存放單個字符,而不是完整的字符串。

----一個字符(character),就是單個字母(letter),許多字母構成一個單詞,一組單詞組成句子,以此類推。但是對於含有諸如中文信息的字符,就不是那麼簡單了。

----Java的基本的char類型被定義成無符號的16位,它是Java中唯一的一個無符號類型。使用16位表達字符的主要原因是要讓Java能夠支持任何Unicode字符,因此而使得Java適用於描述或顯示任何被Unicode支持的語言,可移植性也就會更好。但是,能夠支持某種語言的字符串顯示,和能夠正確打印某種語言的字符串,常常是兩個不同的問題。由於Oak(Java最初的代號)開發組的主要環境是Unix系統和某些源於Unix的系統,所以對開發人員來說,最為方便實用的字符集是ISOLatin-1。相應地,這一開發組就帶有Unix遺傳性,也就導致了Java的I/O系統在很大程度上以Unix的流概念為模型,而在Unix系統中,每一種I/O設備都是用一串8比特的流來表示。這種在I/O系統方面取模於Unix的做法,使得Java語言擁有16位的Java字符,而卻只有8位的輸入設備,這樣就給Java帶來了些不足。因此在任何一處Java字符串按8位來讀入或寫出的地方,都得有一小段程序代碼,被稱為"劈(hack)",來將8位的字符映射成為16位Unicode,或將16位的Unicode劈成8位字符。

2、問題及解決

----我們要實現從一個文件讀取信息,尤其是讀取含有中文信息的文件,並將讀取到的信息顯示在屏幕上,一般我們使用FileInputStream函數打開文件、readChar函數讀入字符。如下:

import Java.io.*;

public class rf{

public static void main(String args[]) {

FileInputStream fis;

DataInputStream dis;

char c;

try {

fis = new FileInputStream("xinxi.txt");

dis = new DataInputStream(fis);

while (true) {

c = dis.readChar();

System.out.print(c);

System.out.flush();

if (c == '\n') break;

}

fis.close();

} catch (Exception e) { }

System.exit(0);

}

}

----但是事實上,運行這一程序,所能得到的輸出結果是一堆無用的亂碼。不能正確輸出xinxi.txt文件內容,其原因是readChar函數讀入的是16位的Unicode字符,而System.out.print卻將其當作八位的ISO latin-1字符輸出。

----Java 1.1版本引入了一套全新的Readers和Writers接口來處理字符。我們可以利用InputStreamReader類而不是DataInputStream來處理文件。修改上面的程序如下:

import Java.io.*;

public class rf {

public static void main(String args[]) {

FileInputStream fis;

InputStreamReader irs;

char ch;

try {

fis = new FileInputStream("xinxi.txt");

irs = new InputStreamReader(fis);

while (true) {

ch = (char) irs.read();

System.out.print(c);

System.out.flush();

if (ch == '\n') break;

}

fis.close();

} catch (Exception e) { }

System.exit(0);

}

}

----這樣才能正確輸出xinxi.txt中的文本(尤其是中文信息)。另外,當xinxi.txt文件來自不同的機器,即來自不同操作平台(或漢字內碼不同)的機器,比如: 文件來自客戶端(客戶端上傳文件給服務器),而讀取文中信息的操作由服務器端執行。如果用上面的程序來實現這一功能,就有可能仍然不能得到正確的結果。其原因就是輸入編碼轉換失敗,我們還需要進行如下的改動:

......

int c1;

int j=0;

StringBuffer str=new StringBuffer();

char lll[][]= new char[20][500];

String ll="";

try {

fis = new FileInputStream("fname.txt");

irs = new InputStreamReader(fis);

c1=irs.read(lll[1],0,50);

while (lll[1][j]!=' ') {

str.append(lll[1][j]);

j=j+1;

}

ll=str.toString();

System.out.println(ll);

} catch (IOException e) {

System.out.println(e.toString());}

......

----這樣,輸出的結果就正確了。當然,上面的程序是不完整的,只是說明了一下解決的方法。

----總之,Java語言中字符處理,尤其是中文信息的處理,比較特殊。在Java中,字符處理的關鍵是要將十六位Unicode字符,轉換為本地下層平台也就是運行Java虛擬處理機的平台能夠理解的字符形式。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved