Java 编程中的中文问题及其解决方法
摘要: 摘要:本文提出了 Java 程序设计中遇到的中文问题,阐述了产生中问题的原因, 并提出了解决 Java 中文问题的方法。 关键词: 关键词:Java 中文问题 方法
在使用 Java 技术进行程序
设计、软件开发中,经常会遇到中文问 题,即应该显示中文的时候,却出现莫名其妙的乱码,特别是在读取 数据库中的中文信息时,问题特别明显。本文阐述了产生中文问题的 原因,并提出了解决 Java 中文
问题的方法。
1、 Java 中文问题的提出
Java 和其他语言(例如 C 语言)对字符进行了不同的描述,Java 使用的 16 位的 Unicode 字符集(该标准描述了许多语言的各种不同 字符) ,因此 Java 字符是一个 16 位的无符号整数,字符变量用来存 放单个字符,而不是完整的字符串。 一个字符(character) ,就是一个字母(letter) ,许多字母构成 一个单词,一一组单词组成句子,以此类推。但是对于含有中文信息 的字符,就不那么简单了。Java 基本的 character 类型被定义成无 符号的 16 位,它是 Java 中唯一的一个无符号类型。使用 16 位表达 字符的主要原因是要让 Java 能够支持任何 Unicode 字符,因此而使 得 Java 适用于描述或显示任何被 Unicode 支持的语言,可移植性也 就更好,但能够支持某种语言的字符串显示和能够争取让、额达因某 种语言的字符串,常常是两个不同的问题。由于 Oak(Java 最初的代 号)开发组的主要环境是 Unix 系统和某些源于 Unix 的系统,所以对
开发人员来说,最为方便实用的字符集是 ISO Latin-1。相应地,这 一开发组就带有 Unix 遗传性, 也就导致了 Java 的 I/O 系统在很大程 度上以 Unix 的流概念为模型,而在 Unix 系统中,每一种 I/O 设备都 是一串 8 比特的流来表示, 这种在 I/O 系统方面取模于 Unix 的做法, 使得 Java 语言拥有 16 位的 Java 字符,而却只有 8 位的输入设备, 这样就给 Java 带来了一些不足。 因此在任何一处 Java 字符串按 8 位 的输入设备,这样就给 Java 带来了一些不足。因此在任何一处
Java 字符串按 8 位读入或写出的地方, 都得有一小段
程序代码, 被称为 “劈 (hack),来将八位的字符映射成 16 位 Unicode,或将这 16 位的 ” Unicode 劈成 8 位字符。
2 Java 中文问题的分析与解决
我们以 Java Servlet 技术开发数据库应用程序为例,分析 Java 的 中文问题及其解决方法。 要实现从 Servlet 输入流中读取信息, 尤其是读取含有中文信息的 文件,并将读取到的信息显示在屏幕上,一般的方法是使用 InputStream 函数打开文件,readLine 函数读入字符。 例如: String sEnglish=”wheat”; String sChinese=”小麦”; String s=
”小麦 wheat”; sEnglish 的字符长度是 5,sChinese 的长度是 4,而 s 默认的长度 是 14,对于 sEnglish 来说,Java 中的个各类都支持得非常好,肯定
能够正确显示。但对于 sChinese 和 s 来说,虽然 Java 的基本类已 经考虑到对多国字符的支持(默认 Unicode 编码) ,如果操作系统默 认的编码不是 Unicode,而是国标码等,那么从 Java 源代码到得到 正确的结果,要经过“Java
源代码->Java 字节码->虚拟机->操作系 统->显示设备”的过程,在上述过程中的每一步骤,都必须正确处理 汉字的编码,才能使最终的显示结果正确。 (1)Java 源代码->Java 字节码。标准的 Java 编译器 javac 使用 的字符集是系统默认的字符集, 比如在中文 Windows 操作
系统上就是 GBK,而在 Linux 操作系统上就是 ISO-8859-1,所以在 Linux 操作系 统上变异的类中原文件中的中文字符都出现了问题, 解决的办法就是 在编译的时候添加 encoding 参数,这样才能够与平台无关。用法就 是 javac endcoding GBK。 (2)Java 字节码->虚拟机->操作系统。Java 运行环境(JRE)分 英文版和国际版, 但只有国际版才支持非英文字符。 Java 开发工具 包(JDK)肯定支持多国字符