JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换
JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

【适用范围】

适用EOS所有版本,操作系统不限,数据库不限

【问题描述和定位】

JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

【解决方案和步骤】

1、函数介绍

在Java中,字符串用统一的Unicode编码,每个字符占用两个字节,与编码有关的两个主要函数为:1)将字符串用指定的编码集合解析成字节数组,完成Unicode-〉charsetName转换

public byte[] getBytes(String charsetName) throws UnsupportedEncodingException

2)将字节数组以指定的编码集合构造成字符串,完成charsetName-〉Unicode转换

public String(byte[] bytes, String charsetName) throws UnsupportedEncodingException 2、Unicode与各编码之间的直接转换

下面以对中文字符串"a中文"的编码转换为例,来了解各种编码之间的转换

1)Unicode和GBK

测试结果如下,每个汉字转换为两个字节,且是可逆的,即通过字节可以转换回字符串

String-GBK〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4 ByteArray-GBK〉String:0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u4E2D\u6587(a中文)2)Unicode和UTF-8

测试结果如下,每个汉字转换为三个字节,且是可逆的,即通过字节可以转换回字符串

String-UTF-8〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE 6%0x96 0x87

ByteArray-UTF-8〉String:0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉\u0061\u4E2D\u6 587(a中文)

3)Unicode和ISO-8859-1

测试结果如下,当存在汉字时转换失败,非可逆,即通过字节不能再转换回字符串

String-ISO-8859-1〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0x3F 0x3F ByteArray-ISO-8859-1〉String:0x61 0x3F 0x3F-〉\u0061\u003F\u003F(a??)

3、Unicode与各编码之间的交叉转换

在上面直接转换中,由字符串(Unicode)生成的字节数组,在构造回字符串时,使用的是正确的编码集合,如果使用的不是正确的编码集合会怎样呢?会正确构造吗?如果不能正确构造能有办法恢复吗?会信息丢失吗?

下面我们就来看看这种情况,这部分可以说明在某些情况下虽然我们最终正确显示了结果,但其间仍然进行了不正确的转换。

1)能够正确显示的中间不正确转换

我们知道String-GBK〉ByteArray-GBK〉String是正确的,但如果我们采用String-GBK〉ByteA rray-ISO-8859-1〉String呢?通过测试结果如下:

String-GBK〉ByteArray-ISO-8859-1〉String:\u0061\u4E2D\u6587(a中文)-〉0x61 0x D6 0xD0 0xCE 0xC4-〉\u0061\u00D6\u00D0\u00CE\u00C4(a????)

这时我们得到的字符串为?乱码“a????”,但是通过继续转换我们仍然可以复原回正确的字符串“a中文”,过程如下:

String-GBK〉ByteArray-ISO-8859-1〉String-ISO-8859-1〉ByteArray-GBK〉String

对应:\u0061\u4E2D\u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u00D6\u 00D0\u00CE\u00C4(a????)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u4E2D\u6587(a 中文)

也就是我们在首次构造字符串时,我们用了错误的编码集合得到了错误的乱码,但是我们通过错上加错,再用错误的编码集合获取字节数组,然后再用正确的编码集合构造,就又恢复了正确的字符串。这时就属于是“能够正确显示的中间不正确转换”。在Jsp页面提交数据处理时常常发生这种情况。

此外能够正确显示的中间不正确转换还有:

String-UTF-8〉ByteArray-ISO-8859-1〉String-ISO-8859-1〉ByteArray-UTF-8〉String 和

String-UTF-8〉ByteArray-GBK〉String-GBK〉ByteArray-UTF-8〉String

对应:\u0061\u4E2D\u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉\u0 061\u6D93\uE15F\u6783(a涓枃)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉\u006 1\u4E2D\u6587(a中文)

4、编码过程中错误诊断参考

1)一个汉字对应一个问号

在通过ISO-8859-1从字符串获取字节数组时,由于一个Unicode转换成一个byte,当遇到不认识的U nicode时,转换为0x3F,这样无论用哪种编码构造时都会产生一个?乱码。

2)一个汉字对应两个问号

在通过GBK从字符串获取字节数组时,由于一个Unicode转换成两个byte,如果此时用ISO-8859-1或用UTF-8构造字符串就会出现两个问号。

若是通过ISO-8859-1构造可以再通过上面所说的错上加错恢复(即再通过从ISO-8859-1解析,用G BK构造);

若是通过UTF-8构造则会产生Unicode字符"\uFFFD",不能恢复,若再通过String-UTF-8〉Byte Array-GBK〉String,则会出现杂码,如a锟斤拷锟斤拷

3)一个汉字对应三个问号

在通过UTF-8从字符串获取字节数组时,由于一个Unicode转换成三个byte,如果此时用ISO-8859-1构造字符串就会出现三个问号;用GBK构造字符串就会出现杂码,如a涓枃

【备注】

公司内部Javaio流笔试题

公司内部Javaio流笔试题

IO 框架 Key Point * File 类 * 流的分类 * 基本字节流 * 字节过滤流 * 基本字符流、桥转换 * 字符过滤流 * 对象序列化 练习 1. (File 类)以下关于File 类说法正确的是: A.一个File 对象代表了操作系统中的一个文件或者文件夹 B.能够使用File 对象创立和删除一个文件 C.能够使用File 对象创立和删除一个文件夹 D.当一个File 对象被垃圾回收时,系统上对应的文件或文件夹也被删除2. (File 类)有如下代码: public class TestFile{ public static void main(String args[]){ File file = new File(“chp13/corejava.txt”); } } 请选择一个正确答案: A. corejava.txt 文件在系统中被创立 B. 在windows 系统上运行出错,因为路径分隔符不正确 C. corejava.txt 文件在系统中没有被创立

D. 如果corejava.txt 文件已存在,则抛出一个异常 3. (File 类)将下列代码补充完整 class TestMyFile{ public static void main(String args[]) throws Exception{ File file; //创立一个File 对象表示当前目录下的“hello.txt”文件 //判断该文件是否存在 //如果该文件存在,则输出该文件的完整路径 } } 4. (流的分类)对于FileInputStream 来说,从方向上来分,它是_________流,从数据单 位上分,它是__________流,从功能上分,它是____________流。 5. (字节流, FileInputStream)FileInputStream 有三个重载的read 方法,其中 1) 无参的read 方法返回值为___类型,表示_________________ 2) int read(byte[] bs)方法返回值表示______________,参数表示 ________________ 3) int read(byte[] bs, int offset, int len) 方法返回值表示 _______________,参数分别表示 ___________________________。 6. (FileInputStream)下面关于FileInputStream 类型说法正确的是: A.创立FileInputStream 对象是为了读取硬盘上的文件 B.创立FileInputStream 对象时,如果硬盘上对应的文件不存在,则抛出一个异常 C.利用FileInputStream 对象能够创立文件 D.FileInputStream 对象读取文件时,只能读取文本文件。

java中文乱码字符集

java中文解决大全 Abstract:本文深入分析了Java程序设计中Java编译器对java源文件和JVM对class类文件的编码/解码过程,通过此过程的解析透视出了Java编程中中文问题产生的根本原因,最后给出了建议的最优化的解决Java中文问题的方法。 1.中文问题的来源 计算机最初的操作系统支持的编码是单字节的字符编码,于是,在计算机中一切处理程序最初都是以单字节编码的英文为准进行处理。随着计算机的发展,为了适应世界其它民族的语言(当然包括我们的汉字),人们提出了UNICODE编码,它采用双字节编码,兼容英文字符和其它民族的双字节字符编码,所以,目前,大多数国际性的软件内部均采用UNICODE编码,在软件运行时,它获得本地支持系统(多数时间是操作系统)默认支持的编码格式,然后再将软件内部的UNICODE转化为本地系统默认支持的格式显示出来。Java的JDK和JVM即是如此,我这里说的JDK是指国际版的JDK,我们大多数程序员使用的是国际化的JDK版本,以下所有的JDK均指国际化的JDK版本。我们的汉字是双字节编码语言,为了能让计算机处理中文,我们自己制定的gb2312、GBK、GBK2K等标准以适应计算机处理的需求。所以,大部分的操作系统为了适应我们处理中文的需求,均定制有中文操作系统,它们采用的是GBK,GB2312编码格式以正确显示我们的汉字。如:中文Win2K默认采用的是GBK编码显示,在中文WIN2k中保存文件时默认采用的保存文件的编码格式也是GBK的,即,所有在中文WIN2K中保存的文件它的内部编码默认均采用GBK编码,注意:GBK是在GB2312基础上扩充来的。 由于Java语言内部采用UNICODE编码,所以在JAVA程序运行时,就存在着一个从UNICODE编码和对应的操作系统及浏览器支持的编码格式转换输入、输出的问题,这个转换过程有着一系列的步骤,如果其中任何一步出错,则显示出来的汉字就会出是乱码,这就是我们常见的JAVA中文问题。 同时,Java是一个跨平台的编程语言,也即我们编写的程序不仅能在中文windows上运行,也能在中文Linux等系统上运行,同时也要求能在英文等系统上运行(我们经常看到有人把在中文win2k上编写的JAVA程序,移植到英文Linux上运行)。这种移植操作也会带来中文问题。 还有,有人使用英文的操作系统和英文的IE等浏览器,来运行带中文字符的程序和浏览中文网页,它们本身就不支持中文,也会带来中文问题。 几乎所有的浏览器默认在传递参数时都是以UTF-8编码格式来传递,而不是按中文编码传递,所以,传递中文参数时也会有问题,从而带来乱码现象。

[原创]java创建ISO8583报文字符流

[原创]java创建ISO8583报文字符流 /* * 创建日期2005-8-26 * * TODO 要更改此生成的文件的模板,请转至 * 窗口-首选项-Java -代码样式-代码模板*/ package com.trade;import java.util.HashMap;/** * @author GYGT * * TODO 要更改此生成的类型注释的模板,请转至 * 窗口-首选项-Java -代码样式-代码模板*/ public class ProduceTradeMessage { //域号字长属性 private HashMap fieldPro; //域号最大字长 private HashMap fieldLen;

//输入域值 private HashMap inputField = new HashMap(); private HashMap hexmap = new HashMap(); //报文字长 private String TradeLength; //报文类型长度 private String TradeType; //64位域号 private String Field64; //128位域号 private String Field128; //域值 private String FieldContent; //报文字符流 private String TradeMessage; public ProduceTradeMessage(){ inputField();

hexmap(); } /** * 对参数进行设置 ------------------------------------------------------------------------------------------------ * */ private void inputField(){ inputField.put("2","22"); // 两位变长,最大长度22位 inputField.put("3","aaaaaa"); // 6位定长 inputField.put("4","aaaaaaaaaaaa"); // 12位定长 inputField.put("7","aaaaaaaaaa"); // 10位定长

Unicode汉字编码表

Unicode汉字编码表 1 unicode编码表 Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个字符, 比如汉字"经"的编码是0x7ECF,注意字符编码一般用十六进制来表示,为了与十进制区分,十六进制以0x开头,0x7ECF转换成十进制就是32463,UCS-2用两个字节来编码字符,两个字节就是16位二进制, 2的16次方等于65536,所以UCS-2最多能编码65536个字符。 编码从0到127的字符与ASCII编码的字符一样,比如字母"a"的Unicode 编码是0x0061,十进制是97,而"a"的ASCII编码是0x61,十进制也是97, 对于汉字的编码,事实上Unicode 对汉字支持不怎么好,这也是没办法的, 简体和繁体总共有六七万个汉字,而UCS-2最多能表示65536个,才六万多个,所以Unicode只能排除一些几乎不用的汉字,好在常用的简体汉字也不过七千多个,为了能表示所有汉字,Unicode也有UCS-4规范,就是用4个字节来编码字符,不过现在普遍采用的还是UCS-2,只用两个字节来编码,看一下Unicode对汉字的编码: ------------------------------------------------------------------------ 2 汉字编码表 U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F ----------------------------------------------------- 4e00 一丁丂七丄丅丆万丈三上下丌不与丏 4e10 丐丑丒专且丕世丗丘丙业丛东丝丞丟 4e20 丠両丢丣两严並丧丨丩个丫丬中丮丯

Java_IO流

IO流 1,流的分类 按照流的流向划分: 输入流:只能从中读取数据,而不能向其写数据。输入流基类,InputStream和Reader。 输出流:只能向其写入数据,而不能从中读取数据。输出流基类,OutputStream和Writer。 按照操作数据单元划分: 字节流:操作最小数据单元是8位的字节。字节流基类,InputStream和OutputStream。 字符流:操作最小数据单元是16位字节。字符流基类,Reader和Writer。 2,Java IO体系 2.1 IO体系图

2.2 IO体系分类图 3,IO流抽象基类 3.1,输入流的抽象基类:InputStream和Reader InputStream和Reader是所有输入流的基类,它们都是抽象类,本身不能创建实例来执行输入,但它们是所有输入流的模板,所有输入流都使用它们提供的方法。 在InputStream里包含如下三个方法: 》》int read():从输入流中读取单个字节,返回所读取的字节数据(字节数据可直接转换为int类型)。 》》int read(byte[] b):从输入流中读取最多b.length个字节的数据,并将其存储在字节数组b 中,赶回实际读取的字节数。 》》int read(byte[] b,int off,int len):从输入流中读取最多len字节的数据,并将其从off位置开始存储在数组b中,返回实际读取的字节数。 在Reader里包含如下三个方法: 》》int read():从输入流中读取单个字符,返回所读取的字符数据(字符数据可直接转换为int类型)。 》》int read(char[] cbuf):从输入流中读取最多cbuf.length个字符的数据,并将其存储在字符数组cbuf中,赶回实际读取的字符数。 》》int read(char[] cbuf,int off,int len):从输入流中读取最多len字符的数据,并将其从off位置开始存储在数组cbuf中,返回实际读取的字符数。 3.2,输出流的抽象基类:OutputStream和Writer OutputStream和Writer和前面的输入流相似,两个流都提供了如下三个方法: 》》void write(int c):将指定的字节/字符输出到输出流中,其中c代表字节或者字符。 》》void write(byte[]/char[] buf):将字节数组/字符数组中的数据输出到指定的输出流中。》》void write(byte[]/char[] buf,int off,int len):将字节数组/字符数组中从off位置开始,长度为len的字节/字符输出到指定的输出流中。 因为字符流直接以字符作为操作单位,所以Writer可以用字符串来代替字符数组,即以String对象作为参数。Writer里还包含如下两个方法: 》》void write(String str):将字符串str里包含的字符输出到指定的输出流中。 》》void write(String str,int off,int len):将字符串str从off位置开始,长度为len的字符输出到指定输出流中。 4,IO流程序异常处理的标准方式 import java.io.*;

Java中文乱码问题产生原因分析

Java中文乱码问题产生原因分析 在计算机中,只有二进制的数据,不管数据是在内存中,还是在外部存储设备上。对于我们所看到的字符,也是以二进制数据的形式存在的。不同字符对应二进制数的规则,就是字符的编码。字符编码的集合称为字符集。 17.1.1 常用字符集 在早期的计算机系统中,使用的字符非常少,这些字符包括26个英文字母、数字符号和一些常用符号(包括控制符号),对这些字符进行编码,用1个字节就足够了(1个字节可以表示28=256种字符)。然而实际上,表示这些字符,只使用了1个字节的7位,这就是ASCII编码。

1.ASCII ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。每一个ASCII码与一个8位(bit)二进制数对应。其最高位是0,相应的十进制数是0~127。例如,数字字符“0”的编码用十进制数表示就是48。另有128个扩展的ASCII码,最高位都是1,由一些图形和画线符号组成。ASCII是现今最通用的单字节编码系统。 ASCII用一个字节来表示字符,最多能够表示256种字符。随着计算机的普及,许多国家都将本地的语言符号引入到计算机中,扩展了计算机中字符的范围,于是就出现了各种不同的字符集。 2.ISO8859-1 因为ASCII码中缺少£、ü和许多书写其他语言所需的字符,为此,可以通过指定128以后的字符来扩展ASCII码。国际标准组织(ISO)定义了几个不同的字符集,它们是在ASCII码基础上增加了其他语言和地区需要的字符。其中最常用的是ISO8859-1,通常叫做Latin-1。Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,其中0~127的字符与ASCII码相同。ISO 8859另外定义了14个适用于不同文字的字符集(8859-2到8859-15)。这些字符集共享0~127的ASCII码,只是每个字符集都包含了128~255的其他字符。 3.GB2312和GBK GB2312是中华人民共和国国家标准汉字信息交换用编码,全称《信息交换用汉字编码字符集-基本集》,标准号为GB2312-80,是一个由中华人民共和国国家标准总局发布的关于简化汉字的编码,通行于中国大陆和新加坡,简称国标码。 因为中文字符数量较多,所以采用两个字节来表示一个字符,分别称为高位和低位。为了和ASCII码有所区别,中文字符的每一个字节的最高位都用1来表示。GB2312字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,也是最基本的中文字符集。它包含了大部分常用的一、二级汉字和9区的符号,其编码范围是高位0xa1-0xfe,低位也是0xa1-0xfe,汉字从0xb0a1开始,结束于0xf 7fe。 为了对更多的字符和符号进行编码,由前电子部科技质量司和国家技术监督局标准化司于1995年12月颁布了GBK(K是“扩展”的汉语拼音第一个字母)编码规范,在新的编码系统里,除了完全兼容GB2312外,还对繁体中文、一些不常用的汉字和许多符号进行了编码。它也是现阶段Windows和其他一些中文操作系统的默认字符集,但并不是所有的国际化软件都支持该字符集。不过要注意的是GBK不是国家标准,它只是规范。GBK字符集包含了20 902个汉字,其编码范围是0x8140-0xfefe。 每个国家(或区域)都规定了计算机信息交换用的字符编码集,这就造成了交流上的困难。想像一下,你发送一封中文邮件给一位远在西班牙的朋友,当邮件通过网络发送出去的时候,你所书写的中文字符会按照本地的字符集GBK转换为二进制编码数据,然后发送出去。当你的朋友接收到邮件(二进制数据)后,查看信件时,会按照他所用系统的字符集,将二进制编码数据解码为字符,然而由于两种字符集之间编码的规则不同,导致转换出现乱码。这是因为,在不同的字符集之间,同样的数字可能对应了不同的符号,也可能在另一种字符集中,该数字没有对应符号。 为了解决上述问题,统一全世界的字符编码,由Unicode协会1制定并发布了Unicode编码。 4.Unicode Unicode(统一的字符编码标准集)使用0~65535的双字节无符号数对每一个字符进行编码。它不仅包含来自英语和其他西欧国家字母表中的常见字母和符号,也包含来自古斯拉夫语、希腊语、希伯来语、阿拉伯语和梵语的字母表。另外还包含汉语和日语的象形汉字和韩国的Hangul音节表。 目前已经定义了40000多个不同的Unicode字符,剩余25000个空缺留给将来扩展使用。其中大约20 1Unicode协会是由IBM、微软、Adobe、SUN、加州大学伯克利分校等公司和组织所组成的非营利性组织。

IO流面试题(JAVA)

IO流(Java)面试题 一:IO流整体说明? 用的是装饰模式,装饰模式有四个角色,分别是通用接口、本原、抽象装饰、具体装饰,因为是将本原聚合到了装饰中,所以可以将本原或装饰通过构造子注入到另一个装饰,多个装饰可以随意的组合,形成一个综合的功能对象。 io流分为输入流及输出流,输入流是文件到内存,输出流是内存到文件。 流分为低层流及高层流,在实例化高层流时必须通过构造子将低层流注入到高层流中。 输入流通用的方法是read(),read(char[]),read(byte[]),readline。 输出流的通用方法是write(int),write(byte[]),write[char[]],print("string")。 当读取一个文件时,对于以字节/字节数组,字符/字符数组读取的结束条件是!=-1,对于以字符串读取的结束条件是!=null。 对于有缓存的输出时,要想写入到文件必须flush或close。 二:输入字节流的体系结构? 输入字节流的体系结构: InputStream FileInputStream FilterInputStream ObjectInputStream DataInputStream BufferedInputStream 实现代码: --读一个字节 int temp=fis.read(); while(temp!=-1) { System.out.print(temp); temp=fis.read(); } --读一批字节 byte[] bytes=new byte[1000]; int result=fis.read(bytes); while(result!=-1) { String temp=new String(bytes,0,result); result=fis.read(bytes); } 三:输出的字节流体系结构? 输出的字节流的体系结构: OutputStream FileOutputStream FilterOutputStreame ObjectOutputStream BufferedOutputStream DataOutputStream PrintStream 实现代码:

Java中编码以及Unicode总结

Java中编码以及Unicode总结 1.基本概念 ●bit 位只能是0或者1 ●byte 字节一个字节是8位,1 byte=8 bits 计算机表示的基本单位 ●KB,MB,GB,TB,PB是以1024与byte进行换算 ●进制用符号进行计数十进制、二进制、八进制(011)、十六进制(0xFF) 字符文字和符号的总称 ●字符集多个字符集合的总称。ASCII字符集、GB2312字符集、GBK字符集、BIG5 字符集、GB18003字符集、Unicode字符集 ●byte可表示2^8=256个字符的表示 0 0×00 0000,0000 1 0×01 0000,0001 2 0×01 0000,0010 127 0×7F 0111,1111 -128 0×80 1000,0000 -2 0xFE 1111,1110 -1 0xFF 1111,1111 ●以补码的形式表示的二进制编码。 -2的表示,2=0000,0010,反码1111,1101,补码=反码+1= 1111,1110表示的就是1111,1110-1=1111,1101,取反就是0000,0010也就是2,所以 就是-2 2.字符集和编码 2.1.字符(Character) 字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。 2.2.字符集(Character Set) 一组抽象字符的集合就是字符集(Character Set)。字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。字符集的子集也是字符集。 计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码(Encoding)。制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,会确定用几个字节来编码。每种编码都限定了一个明确的字符集合,叫做被编码过的字符集(Coded Character Set),这是字符集的另外一个含义。通常所说的字符集大多都是指编码字符集(Coded Character Set)。

javaio流学习总结

javaio流学习总结 javaio流学习总结 总结一:javaio流学习总结 一、IO流的三种分类方式 1.按流的方向分为:输入流和输出流 2.按流的数据单位不同分为:字节流和字符流 3.按流的功能不同分为:节点流和处理流 二、IO流的四大抽象类: 字符流:Reader Writer 字节流:InputStream(读数据) OutputStream(写数据) 三、InputStream的基本方法 int read() thros IOExeption 读取一个字节以整数形式返回,如果返回-1已到输入流的末尾 void lose() thros IOExeption 关闭流释放内存资源 long skip(long n) thros IOExeption 跳过n个字节不读 四、OutputStream的基本方法 void rite(int b) thros IOExeption 向输出流写入一个字节数据 void flush() thros IOExeption 将输出流中缓冲的数据全部写出到目的地 五、Writer的基本方法

void rite(int ) thros IOExeption 向输出流写入一个字符数据 void rite(String str) thros IOExeption将一个字符串中的字符写入到输出流 void rite(String str,int offset,int length) 将一个字符串从offset开始的length个字符写入到输出流 void flush() thros IOExeption 将输出流中缓冲的数据全部写出到目的地 六、Reader的基本方法 int read() thros IOExeption 读取一个字符以整数形式返回,如果返回-1已到输入流的末尾 七、节点流类型 八、访问文件之FileInputStream和FileOutputStream继承基类用于向文件中输入输出字节 九、访问文件之FileReader和FileWriter继承基类用于向文件中输入输出字符 ----输出流在构造函数第二个参数可以设置true意义为跟在已有文件后进行输入 ----此类流会抛出FileNotFoundExeption需要对其进行显示捕捉 十、缓冲流:缓冲流要套接在相应的节点流之上,提高了读写的效率。 此处理流的构造方法都得传相对应的基类类型 BufferedReader:提供了readLine方法用于高校读取一行字符串

unicode中的中文编码说明

编码表 平面0 (0000–FFFF): 基本多文种平面(Basic Multilingual Plane, BMP). 平面1 (10000–1FFFF): 多文种补充平面(Supplementary Multilingual Plane, SMP). 平面2 (20000–2FFFF): 表意文字补充平面(Supplementary Ideographic Plane, SIP). 平面3 (30000–3FFFF): 表意文字第三平面(Tertiary Ideographic Plane, TIP). 平面4 to 13 (40000–DFFFF)尚未使用 平面14 (E0000–EFFFF): 特别用途补充平面(Supplementary Special-purpose Plane, SSP) 平面15 (F0000–FFFFF)保留作为私人使用区(Private Use Area, PUA) 平面16 (100000–10FFFF),保留作为私人使用区(Private Use Area, PUA) 注意1 现在网上大多数用于判断中文字符的是U+4E00..U+9FA5这个范围是只是“中日韩统一表意文字”这个区间,但这不是全部,如果要全部包含,则还要他们的扩展集、部首、象形字、注间字母等等; 2E80-A4CF加上F900-FAFF加上FE30-FE4F。 其中: 2E80-A4CF 包含了中日朝部首补充、康熙部首、表意文字描述符、中日朝符号和标点、日文平假名、日文片假名、注音字母、谚文兼容字母、象形字注释标志、注音字母扩展、中日朝笔画、日文片假名语音扩展、带圈中日朝字母和月份、中日朝兼容、中日朝统一表意文字扩展A、易经六十四卦符号、中日韩统一表意文字、彝文音节、彝文字根 F900-FAFF 中日朝兼容表意文字 FE30-FE4F 中日朝兼容形式 所以,一般用4E00-9FA5已经可以,如果要更广,则用2E80-A4CF || F900-FAFF||FE30-FE4F 注意2 全角ASCII、全角中英文标点、半宽片假名、半宽平假名、半宽韩文字母:FF00-FFEF

对java中的输入/输出的总结(字节流,字符流)

1,先是关于字节流 import java.io.*; public class SimpleIO { /** System 类包含一些有用的类字段和方法。它不能被实例化。 字段摘要 static PrintStream err “标准”错误输出流。 static InputStream in “标准”输入流。 static PrintStream out “标准”输出流。 字段不是一个类,它是一个类的static属性 out是System类的一个属性,而它的类型是PrintStream PrintStream是一个类,它有个方法是println(). */ public static void main(String[] args) { // TODO Auto-generated method stub char c; System.out.println("请输入一个字符:"); try { c=(char)System.in.read(); System.out.println("你输入的字符是:"+c); } catch(IOException e) { System.out.println("产生异常"); } } } 2,关于字符流的考虑。 import java.io.*; public class SimpleIOs { /**

https://www.360docs.net/doc/8c1841484.html,ng.Object 继承者 java.io.Reader 继承者 java.io.InputStreamReader 构造方法摘要 InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。 InputStreamReader(InputStream in, Charset cs) 创建使用给定字符集的 InputStreamReader。 InputStreamReader(InputStream in, CharsetDecoder dec) 创建使用给定字符集解码器的 InputStreamReader。 InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的 InputStreamReader。 https://www.360docs.net/doc/8c1841484.html,ng.Object 继承者 java.io.Reader 继承者 java.io.BufferedReader 构造方法摘要 BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。 BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。 readLine()为BufferedReader扣的方法, public String readLine() throws IOException 读取一个文本行。通过下列字符之一即可认为某行已终止:换行 (' ')、回车 (' ') 或回车后直接跟着换行。 返回: 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null 抛出: IOException - 如果发生 I/O 错误 InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。

Java IO流分析整理

Java中的流,可以从不同的角度进行分类。 按照数据流的方向不同可以分为:输入流和输出流。 按照处理数据单位不同可以分为:字节流和字符流。 按照实现功能不同可以分为:节点流和处理流。 输出流: 输入流: 因此输入和输出都是从程序的角度来说的。 字节流:一次读入或读出是8位二进制。 字符流:一次读入或读出是16位二进制。 字节流和字符流的原理是相同的,只不过处理的单位不同而已。后缀是Stream是字节流,而后缀是Reader,Writer是字符流。

节点流:直接与数据源相连,读入或读出。 直接使用节点流,读写不方便,为了更快的读写文件,才有了处理流。处理流:与节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。 Jdk提供的流继承了四大类:InputStream(字节输入流),OutputStream(字节输出流),Reader(字符输入流),Writer(字符输出流)。 以下是java中io中常用的流。

字节输入流: 字节输出流:

字符输入流: 字符输出流: 简单介绍其上图: 对文件进行操作:FileInputStream(字节输入流),FileOutputStream(字节输出流),FileReader(字符输入流),FileWriter(字符输出流)

对管道进行操作:PipedInputStream(字节输入流),PipedOutStream(字节输出流),PipedReader(字符输入流),PipedWriter(字符输出流)PipedInputStream的一个实例要和PipedOutputStream的一个实例共同使用,共同完成管道的读取写入操作。主要用于线程操作。 字节/字符数组:ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter是在内存中开辟了一个字节或字符数组。 Buffered缓冲流::BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是带缓冲区的处理流,缓冲区的作用的主要目的是:避免每次和硬盘打交道,提高数据访问的效率。 转化流:InputStreamReader/OutputStreamWriter,把字节转化成字符。数据流:DataInputStream,DataOutputStream。 因为平时若是我们输出一个8个字节的long类型或4个字节的float类型,那怎么办呢?可以一个字节一个字节输出,也可以把转换成字符串输出,但是这样转换费时间,若是直接输出该多好啊,因此这个数据流就解决了我们输出数据类型的困难。数据流可以直接输出float类型或long类型,提高了数据读写的效率。 打印流:printStream,printWriter,一般是打印到控制台,可以进行控制打印的地方。

java判断文件编码或文本流编码的方法

判定文件编码或文本流编码的方法 在程序中,文本文件经常用来存储标准的ASCII码文本,比如英文、加减乘除等号这些运算符号。文本文件也可能用于存储一些其他非ASCII字符,如基于GBK的简体中文,基于GIG5的繁体中文等等。在存储这些字符时需要正确指定文件的编码格式;而在读取这些文本文件时,有时候就需要自动判定文件的编码格式。 按照给定的字符集存储文本文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三个字节,判定这些字节的值,就可以得知其编码的格式。其实,如果项目运行的平台就是中文操作系统,如果这些文本文件在项目内产生,即开发人员可以控制文本的编码格式,只要判定两种常见的编码就可以了:GBK和UTF-8。由于中文Windows默认的编码是GBK,所以一般只要判定UTF-8编码格式。 对于UTF-8编码格式的文本文件,其前3个字节的值就是-17、-69、-65,所以,判定是否是UTF-8编码格式的代码片段如下: Java代码 1java.io.File f=new java.io.File("待判定的文本文件名"); 2try{ 3java.io.InputStream ios=new java.io.FileInputStream(f); 4byte[] b=new byte[3]; 5ios.read(b); 6ios.close(); 7if(b[0]==-17&&b[1]==-69&&b[2]==-65) 8System.out.println(f.getName()+"编码为UTF-8"); 9else System.out.println(f.getName()+"可能是GBK"); 10}catch(Exception e){ 11 e.printStackTrace(); 12} 上述代码只是简单判定了是否是UTF-8格式编码的文本文件,如果项目对要判定的文本文件编码不可控(比如用户上传的一些HTML、XML等文本),可以采用一个现成的开源项目:cpdetector,它所在的网址是:https://www.360docs.net/doc/8c1841484.html,/。它的类库很小,只有500K左右,利用该类库判定文本文件的代码如下: Java代码

JAVA流大全详细介绍

JAVA流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样,如下图: java.io包是一组流类,分为: 字节流:抽象父类是InputStream和OutputStream 字符流:抽象父类是Reader和Writer 1、InputStream FileInputStream 类:从实际磁盘文件读取数据 ByteArrayInputStream 类:在字节数组中执行读写操作StringBufferInputStream 类:类似于ByteArrayInputStream,将字符串用作内部缓冲器 2、OutputStream 定义用于写入字节或字节数组的方法。 OutputStream类的体系结构 FileOutputStream类:创建文件(如果文件不存在),并将数据写入文件ByteArrayOutputStream类:在内存中创建缓冲器,toByteArray( )和toString( )方法用于数据检索 FilterOutputStream类:高层输出流 File 类:提供定位本地文件系统、描述文件和目录的功能,是java.io 包中引用实际磁盘文件的唯一对象。

流类可以分为: 底层流:包含以字节的形式读写的方法 高层过滤器流:用于读写高层信息 高层流要求底层流作为基础。 FilterInputStream 类的子类包括: DataInputStream类:提供读取任意对象的能力 DataOutputStream类:提供写入任意对象的能力 BufferedInputStream类:允许程序一次一个字节地从流读取数据BufferedOutputStream类:允许程序一次一个字节地向流写入数据PrintStream类:用于写入文本或基本类型 3、Reader 读取字符类型。 Reader类的体系结构 FileReader:使读取字符文件成为可能 StringReader:读取字符串的字符 CharArrayReader:允许将字符数组用作输入InputStreamReader:从输入流读取字节,并将它们转换成字符FilterReader:允许读取过滤字符流 BufferedReader:接受Reader 对象为参数,并对其添加字符缓冲器4、Writer 写入字符类型。 Writer类的体系结构 FileWriter:允许将字符类型数据写入文件 CharArrayWriter:允许将字符缓冲器用作输出流

计算机常见编码

计算机常见编码 一.有关编码的基础知识 1. 位 bit 最小的单元 字节 byte 机器语言的单位 1byte=8bits 1KB=1024byte 1MB=1024KB 1GB=1024MB 2. 二进制 binary 八进制 octal 十进制 decimal 十六进制 hex 3. 字符:是各种文字和符号的总称,包括各个国家的文字,标点符号,图形符号,数字等。 字符集:字符集是多个符号的集合,每个字符集包含的字符个数不同。 字符编码:字符集只是规定了有哪些字符,而最终决定采用哪些字符,每一 个字符用多少字节表示等问题,则是由编码来决定的。计算机要 准确的处理各种字符集文字,需要进行字符编码,以便计算机能 够识别和存储各种文字。 二.常见字符集的编码介绍: 常见的字符集有:ASCII 字符集,GB2312 字符集,BIG5 字符集,GB18030 字符集,Unicode 字符集,下面一一介绍: 1. ASCII 字符集: 定义: 美国信息互换标准代码,是基于罗马字母表的一套电脑编码系统,主要显示 英语和一些西欧语言,是现今最通用的单字节编码系统。 包含内容: 控制字符(回车键,退格,换行键等) 可显示字符(英文大小写,阿拉伯数字,西文符号) 扩展字符集(表格符号,计算符号,希腊字母,拉丁符号) 编码方式: 第 0-31 号及 127 号是控制字符或通讯专用字符; 第 32-126 号是字符,其中 48-57 号为 0-9 十个阿拉伯数字,65-90 号为 26 个大写英文字母,97-122 号为 26 个英文小写字母,其余为一些标点符号,运 算符号等。 在计算机存储单元中,一个 ASCII 码值占一个字节(8 个二进制位),最高位 是用作奇偶检验位。【奇偶校验是指:在代码传送的过程中,用来检验是否 出错的一种方法。】奇偶校验分为奇校验和偶校验。奇校验规定:正确的代 码一个字节中 1 的个数必须是奇数,若非奇数,则在最高位添 1;偶校验规 定:正确的代码一个字节中 1 的个数必须是奇数,若非奇数,则在最高位添 1。

(完整版)5Java第五单元练习题-输入流与输出流

5 Java 输入流与输出流 5.1 单项选择题 1.实现字符流的写操作类是( A . FileReader B . Writer C )。 . FileInputStream D . FileOutputStream 2. 实现字符流的读操作类是( )。 A . FileReader B . Writer C . FileInputStream D . FileOutputStream 3.凡是从中央处理器流向外部设备的数据流称为() A. 文件流 B. 字符流 C. 输入流 D. 输出流 4.构造 BufferedInputStream 的合适参数是哪一个?( ) A . FileInputStream B . BufferedOutputStream C . File D . FileOuterStream 5.在编写 Java Application 程序时,若需要使用到标准输入输出语句,必须在程序的开 头写上( )语句。 D . import java.awt.Graphics ; 6.下列流中哪个不属于字符流?( A . InputStreamReader C . FilterReader 7.流的传递方式是() A. 并行的 B. 串行的 C. 并行和串行 D. 以上都不对 8.字符流与字节流的区别在于( ) A. 前者带有缓冲,后者没有 B. 前者是块读写,后者是字节读写 C. 二者没有区别,可以互换使用 A . import java.awt.* ; B import java.applet.Applet ; C . import java.io.* ; ) B . BufferedReade r D . FileInputStream

常用汉字的Unicode码表

包含汉字: 的一是了我不人在他有这个上们来到时大地为子中你说生国年着就那和要她出也得里后自以会家可下而过天去能对小多然于心学么之 都好看起发当没成只如事把还用第样道想作种开美总从无情己面最女但现前些所同日手又行意动方期它头经长儿回位分爱老因很给 名法间斯知世什两次使身者被高已亲其进此话常与活正感见明问力理尔点文几定本公特做外孩相西果走将月十实向声车全信重 三机工物气每并别真打太新比才便夫再书部水像眼等体却加电主界门利海受听表德少克代员许稜先口由死安写性马光白或住难 望教命花结乐色更拉东神记处让母父应直字场平报友关放至张认接告入笑内英军候民岁往何度山觉路带万男边风解叫任金快原 吃妈变通师立象数四失满战远格士音轻目条呢病始达深完今提求清王化空业思切怎非找片罗钱紶吗语元喜曾离飞科言干流欢约 各即指合反题必该论交终林请医晚制球决窢传画保读运及则房早院量苦火布品近坐产答星精视五连司巴奇管类未朋且婚台夜青 北队久乎越观落尽形影红爸百令周吧识步希亚术留市半热送兴造谈容极随演收首根讲整式取照办强石古华諣拿计您装似足双妻 尼转诉米称丽客南领节衣站黑刻统断福城故历惊脸选包紧争另建维绝树系伤示愿持千史谁准联妇纪基买志静阿诗独复痛消社算 义竟确酒需单治卡幸兰念举仅钟怕共毛句息功官待究跟穿室易游程号居考突皮哪费倒价图具刚脑永歌响商礼细专黄块脚味灵改 据般破引食仍存众注笔甚某沉血备习校默务土微娘须试怀料调广蜖苏显赛查密议底列富梦错座参八除跑亮假印设线温虽掉京初 养香停际致阳纸李纳验助激够严证帝饭忘趣支春集丈木研班普导顿睡展跳获艺六波察群皇段急庭创区奥器谢弟店否害草排背止 组州朝封睛板角况曲馆育忙质河续哥呼若推境遇雨标姐充围案伦护冷警贝著雪索剧啊船险烟依斗值帮汉慢佛肯闻唱沙局伯族低 玩资屋击速顾泪洲团圣旁堂兵七露园牛哭旅街劳型烈姑陈莫鱼异抱宝权鲁简态级票怪寻杀律胜份汽右洋范床舞秘午登楼贵吸责 例追较职属渐左录丝牙党继托赶章智冲叶胡吉卖坚喝肉遗救修松临藏担戏善卫药悲敢靠伊村戴词森耳差短祖云规窗散迷油旧适 乡架恩投弹铁博雷府压超负勒杂醒洗采毫嘴毕九冰既状乱景席珍童顶派素脱农疑练野按犯拍征坏骨余承置臓彩灯巨琴免环姆暗 换技翻束增忍餐洛塞缺忆判欧层付阵玛批岛项狗休懂武革良恶恋委拥娜妙探呀营退摇弄桌熟诺宣银势奖宫忽套康供优课鸟喊降 夏困刘罪亡鞋健模败伴守挥鲜财孤枪禁恐伙杰迹妹藸遍盖副坦牌江顺秋萨菜划授归浪听凡预奶雄升碃编典袋莱含盛济蒙棋端腿 招释介烧误 unicode 编码 的一是了我不人在他有这%u4e2a上们来

相关文档
最新文档