?? java語(yǔ)言中字符的處理.txt
字號(hào):
作者:jeru
email: jeru@163.net
日期:2000-12-26 10:46:54
山西省網(wǎng)絡(luò)管理中心任軍
----摘要:本文主要討論了Java語(yǔ)言中字符的特殊表達(dá)形式,尤其是中文信息的表達(dá)處理,闡述了字符處理的關(guān)鍵是要將十六位Unicode字符,轉(zhuǎn)換為本地下層平臺(tái),也就是運(yùn)行Java虛擬處理機(jī)的平臺(tái)能夠理解的字符形式。
----關(guān)鍵詞:Java、字符、8位、16位、Unicode字符集
----Java是一種編程語(yǔ)言、一個(gè)運(yùn)行系統(tǒng)、一套開(kāi)發(fā)工具和一個(gè)應(yīng)用程序編程界面(API)。Java建立在C++的熟悉、有用的特征之上,而取消了C++的復(fù)雜的、危險(xiǎn)的和多余的元素。它是一個(gè)更安全、更簡(jiǎn)單、更容易使用的語(yǔ)言。
1、Java的字符表達(dá)
----Java語(yǔ)言和C語(yǔ)言對(duì)字符進(jìn)行了互不相同的描述,Java使用16位的Unicode字符集(該標(biāo)準(zhǔn)描述了許多語(yǔ)言的各種不同字符),因此Java字符是一個(gè)16位的無(wú)符號(hào)整數(shù),字符變量用來(lái)存放單個(gè)字符,而不是完整的字符串。
----一個(gè)字符(character),就是單個(gè)字母(letter),許多字母構(gòu)成一個(gè)單詞,一組單詞組成句子,以此類推。但是對(duì)于含有諸如中文信息的字符,就不是那么簡(jiǎn)單了。
----Java的基本的char類型被定義成無(wú)符號(hào)的16位,它是Java中唯一的一個(gè)無(wú)符號(hào)類型。使用16位表達(dá)字符的主要原因是要讓Java能夠支持任何Unicode字符,因此而使得Java適用于描述或顯示任何被Unicode支持的語(yǔ)言,可移植性也就會(huì)更好。但是,能夠支持某種語(yǔ)言的字符串顯示,和能夠正確打印某種語(yǔ)言的字符串,常常是兩個(gè)不同的問(wèn)題。由于Oak(Java最初的代號(hào))開(kāi)發(fā)組的主要環(huán)境是Unix系統(tǒng)和某些源于Unix的系統(tǒng),所以對(duì)開(kāi)發(fā)人員來(lái)說(shuō),最為方便實(shí)用的字符集是ISOLatin-1。相應(yīng)地,這一開(kāi)發(fā)組就帶有Unix遺傳性,也就導(dǎo)致了Java的I/O系統(tǒng)在很大程度上以Unix的流概念為模型,而在Unix系統(tǒng)中,每一種I/O設(shè)備都是用一串8比特的流來(lái)表示。這種在I/O系統(tǒng)方面取模于Unix的做法,使得Java語(yǔ)言擁有16位的Java字符,而卻只有8位的輸入設(shè)備,這樣就給Java帶來(lái)了些不足。因此在任何一處Java字符串按8位來(lái)讀入或?qū)懗龅牡胤剑嫉糜幸恍《纬绦虼a,被稱為"劈(hack)",來(lái)將8位的字符映射成為16位Unicode,或?qū)?6位的Unicode劈成8位字符。
2、問(wèn)題及解決
----我們要實(shí)現(xiàn)從一個(gè)文件讀取信息,尤其是讀取含有中文信息的文件,并將讀取到的信息顯示在屏幕上,一般我們使用FileInputStream函數(shù)打開(kāi)文件、readChar函數(shù)讀入字符。如下:
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);
}
}
----但是事實(shí)上,運(yùn)行這一程序,所能得到的輸出結(jié)果是一堆無(wú)用的亂碼。不能正確輸出xinxi.txt文件內(nèi)容,其原因是readChar函數(shù)讀入的是16位的Unicode字符,而System.out.print卻將其當(dāng)作八位的ISO latin-1字符輸出。
----Java 1.1版本引入了一套全新的Readers和Writers接口來(lái)處理字符。我們可以利用InputStreamReader類而不是DataInputStream來(lái)處理文件。修改上面的程序如下:
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中的文本(尤其是中文信息)。另外,當(dāng)xinxi.txt文件來(lái)自不同的機(jī)器,即來(lái)自不同操作平臺(tái)(或漢字內(nèi)碼不同)的機(jī)器,比如: 文件來(lái)自客戶端(客戶端上傳文件給服務(wù)器),而讀取文中信息的操作由服務(wù)器端執(zhí)行。如果用上面的程序來(lái)實(shí)現(xiàn)這一功能,就有可能仍然不能得到正確的結(jié)果。其原因就是輸入編碼轉(zhuǎn)換失敗,我們還需要進(jìn)行如下的改動(dòng):
......
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());}
......
----這樣,輸出的結(jié)果就正確了。當(dāng)然,上面的程序是不完整的,只是說(shuō)明了一下解決的方法。
----總之,Java語(yǔ)言中字符處理,尤其是中文信息的處理,比較特殊。在Java中,字符處理的關(guān)鍵是要將十六位Unicode字符,轉(zhuǎn)換為本地下層平臺(tái)也就是運(yùn)行Java虛擬處理機(jī)的平臺(tái)能夠理解的字符形式。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -