摘要本文主要讨论了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 javaio*;
public class rf{
public static void main(String args[]) {
FileInputStream fis;
DataInputStream dis;
char c;
try {
fis = new FileInputStream(xinxitxt);
dis = new DataInputStream(fis);
while (true) {
c = disreadChar();
Systemoutprint(c);
Systemoutflush();
if (c == \n) break;
}
fisclose();
} catch (Exception e) { }
Systemexit();
}
}
但是事实上运行这一程序所能得到的输出结果是一堆无用的乱码不能正确输出xinxitxt文件内容其原因是readChar函数读入的是位的Unicode字符而Systemoutprint却将其当作八位的ISO latin字符输出
Java 版本引入了一套全新的Readers和Writers接口来处理字符我们可以利用InputStreamReader类而不是DataInputStream来处理文件修改上面的程序如下
import javaio*;
public class rf {
public static void main(String args[]) {
FileInputStream fis;
InputStreamReader irs;
char ch;
try {
fis = new FileInputStream(xinxitxt);
irs = new InputStreamReader(fis);
while (true) {
ch = (char) irsread();
Systemoutprint(c);
Systemoutflush();
if (ch == \n) break;
}
fisclose();
} catch (Exception e) { }
Systemexit();
}
}
这样才能正确输出xinxitxt中的文本(尤其是中文信息)另外当xinxitxt文件来自不同的机器即来自不同操作平台(或汉字内码不同)的机器比如 文件来自客户端(客户端上传文件给服务器)而读取文中信息的操作由服务器端执行如果用上面的程序来实现这一功能就有可能仍然不能得到正确的结果其原因就是输入编码转换失败我们还需要进行如下的改动
int c;
int j=;
StringBuffer str=new StringBuffer();
char lll[][]= new char[][];
String ll=;
try {
fis = new FileInputStream(fnametxt);
irs = new InputStreamReader(fis);
c=irsread(lll[]);
while (lll[][j]!= ) {
strappend(lll[][j]);
j=j+;
}
ll=strtoString();
Systemoutprintln(ll);
} catch (IOException e) {
Systemoutprintln(etoString());}
这样输出的结果就正确了当然上面的程序是不完整的只是说明了一下解决的方法
总之Java语言中字符处理尤其是中文信息的处理比较特殊在Java中字符处理的关键是要将十六位Unicode字符转换为本地下层平台也就是运行Java虚拟处理机的平台能够理解的字符形式