摘要
本文主要討論了Java語言中字符的特殊表達形式
尤其是中文信息的表達處理
闡述了字符處理的關鍵是要將十六位Unicode字符
轉換為本地下層平台
也就是運行Java虛擬處理機的平台能夠理解的字符形式
關鍵詞
Java
字符
位
位
Unicode字符集
Java是一種編程語言
一個運行系統
一套開發工具和一個應用程序編程界面(API)
Java建立在C++的熟悉
有用的特征之上
而取消了C++的復雜的
危險的和多余的元素
它是一個更安全
更簡單
更容易使用的語言
Java的字符表達
Java語言和C語言對字符進行了互不相同的描述
Java使用
位的Unicode字符集(該標准描述了許多語言的各種不同字符)
因此Java字符是一個
位的無符號整數
字符變量用來存放單個字符
而不是完整的字符串
一個字符(character)
就是單個字母(letter)
許多字母構成一個單詞
一組單詞組成句子
以此類推
但是對於含有諸如中文信息的字符
就不是那麼簡單了
Java的基本的char類型被定義成無符號的
位
它是Java中唯一的一個無符號類型
使用
位表達字符的主要原因是要讓Java能夠支持任何Unicode字符
因此而使得Java適用於描述或顯示任何被Unicode支持的語言
可移植性也就會更好
但是
能夠支持某種語言的字符串顯示
和能夠正確打印某種語言的字符串
常常是兩個不同的問題
由於Oak(Java最初的代號)開發組的主要環境是Unix系統和某些源於Unix的系統
所以對開發人員來說
最為方便實用的字符集是ISOLatin
相應地
這一開發組就帶有Unix遺傳性
也就導致了Java的I/O系統在很大程度上以Unix的流概念為模型
而在Unix系統中
每一種I/O設備都是用一串
比特的流來表示
這種在I/O系統方面取模於Unix的做法
使得Java語言擁有
位的Java字符
而卻只有
位的輸入設備
這樣就給Java帶來了些不足
因此在任何一處Java字符串按
位來讀入或寫出的地方
都得有一小段程序代碼
被稱為
劈(hack)
來將
位的字符映射成為
位Unicode
或將
位的Unicode劈成
位字符
問題及解決
我們要實現從一個文件讀取信息
尤其是讀取含有中文信息的文件
並將讀取到的信息顯示在屏幕上
一般我們使用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(
);
}
}
但是事實上
運行這一程序
所能得到的輸出結果是一堆無用的亂碼
不能正確輸出xinxi
txt文件內容
其原因是readChar函數讀入的是
位的Unicode字符
而System
out
print卻將其當作八位的ISO latin
字符輸出
Java
版本引入了一套全新的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(
);
}
}
這樣才能正確輸出xinxi
txt中的文本(尤其是中文信息)
另外
當xinxi
txt文件來自不同的機器
即來自不同操作平台(或漢字內碼不同)的機器
比如
文件來自客戶端(客戶端上傳文件給服務器)
而讀取文中信息的操作由服務器端執行
如果用上面的程序來實現這一功能
就有可能仍然不能得到正確的結果
其原因就是輸入編碼轉換失敗
我們還需要進行如下的改動
int c
;
int j=
;
StringBuffer str=new StringBuffer();
char lll[][]= new char[
][
];
String ll=
;
try {
fis = new FileInputStream(
fname
txt
);
irs = new InputStreamReader(fis);
c
=irs
read(lll[
]
);
while (lll[
][j]!=
) {
str
append(lll[
][j]);
j=j+
;
}
ll=str
toString();
System
out
println(ll);
} catch (IOException e) {
System
out
println(e
toString());}
這樣
輸出的結果就正確了
當然
上面的程序是不完整的
只是說明了一下解決的方法
總之
Java語言中字符處理
尤其是中文信息的處理
比較特殊
在Java中
字符處理的關鍵是要將十六位Unicode字符
轉換為本地下層平台也就是運行Java虛擬處理機的平台能夠理解的字符形式
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19254.html