文档库 最新最全的文档下载
当前位置:文档库 › JAVA 字符串编码总结

JAVA 字符串编码总结

JAVA 字符串编码总结
JAVA 字符串编码总结

JAVA 字符串编码总结

出处:https://www.wendangku.net/doc/6312328895.html,/lu7kang/article/details/5571953

String newStr = new String(oldStr.getBytes(), "UTF-8");

java 中的String类是按照unicode进行编码的,当使用String(byte[] bytes, String encoding)构造字符串时,encoding所指的是bytes中的数据是按照那种方式编码的,而不是最后产生的String是什么编码方式,换句话说,是让系统把bytes中的数据由encoding编码方式转换成unicode编码。如果不指明,bytes的编码方式将由jdk根据操作系统决定。

当我们从文件中读数据时,最好使用InputStream方式,然后采用String(byte[] bytes, String encoding)指明文件的编码方式。不要使用Reader 方式,因为Reader方式会自动根据jdk指明的编码方式把文件内容转换成unicode 编码。

当我们从数据库中读文本数据时,采用ResultSet.getBytes()方法取得字节数组,同样采用带编码方式的字符串构造方法即可。

ResultSet rs;

bytep[] bytes = rs.getBytes();

String str = new String(bytes, "gb2312");

不要采取下面的步骤。

ResultSet rs;

String str = rs.getString();

str = new String(str.getBytes("iso8859-1"), "gb2312");

这种编码转换方式效率底。之所以这么做的原因是,ResultSet在getString()方法执行时,默认数据库里的数据编码方式为 iso8859-1。系统会把数据依照iso8859-1的编码方式转换成unicode。使用

str.getBytes("iso8859-1")把数据还原,然后利用new String(bytes,

"gb2312")把数据从gb2312转换成unicode,中间多了好多步骤。

从HttpRequest中读参数时,利用reqeust.setCharacterEncoding()方法设置编码方式,读出的内容就是正确的了。

先说Java。

JVM里面的任何字符串资源都是Unicode,就是说,任何String类型的数据都是Unicode编码。没有例外。既然只有一种编码,那么,我们可以这么说,JVM 里面的String是不带编码的。String相当于 char[]。

JVM里面的 byte[] 数据是带编码的。比如,Big5,GBK,GB2312,UTF-8之类的。

一个GBK编码的byte[] 转换成 String,其实就是从GBK编码向Unicode 编码转换。

一个String转换成一个Big5编码的byte[],其实就是从Unicode编码向Big5编码转换。

所以,Unicode是所有编码转换的中间介质。所有的编码都有一个转换器可以转换到Unicode,而Unicode也可以转换到其他所有的编码。这样构成了一个总线结构。

比如,如果总共有10种编码,那么只需要 10 + 10 = 20个转换器就够了。如果要是两两直接转换,那么,需要的转换器数量是一个组合数字,需要90个转换器。

一个系统的不同部分,都有自己的编码。比如,数据库,文件,JVM,浏览器这4个部分。

在这些部分之间数据交换的地方,就会出现编码问题。比如,数据库和JVM

之间,文件和JVM之间,浏览器和JVM之间。这些问题的原理都是相通的。

编码问题最容易处理的地方是文件和JVM之间。文件IO API带有

encoding 参数,请自行查阅。

最不容易出现编码问题的地方是数据库和JVM之间。这应该是数据库JDBC连接的基本功能。本文不专门进行讨论。

最容易出问题的地方是浏览器和服务器JVM之间(其实,代码里面的字符串更容易出问题,不过,我已经事先声明,本文不讨论代码中的字符串编码)。下面主要讨论这块浏览器和服务器JVM之间的编码问题。

我们把浏览器编码叫做 Browser_Charset,把JVM编码叫做JVM_Charset(通常等于服务器系统编码)。

当浏览器的数据过来的时候,是一个带有Browser_Charset的byte[]。

如果用户处理程序需要一个String类型的数据,那么JVM会好心好意地把这个byte[]转换成String。使用的转换器

是 JVM_Charset -> Unicode。

注意,如果这个时候,Browser_Charset 和 JVM_Charset并不相等。那么,这个自动转换是错误的。

为了弥补这个错误。我们需要做两步工作。

(1) Unicode -> JVM_Charset,把这个String 转换回到原来

的 byte[]。

(2) Browser_Charset -> Unicode,把这个还原的byte[]转换

成 String。

这个效果,和直接从HTTP Request取得byte[],然后执

行 (2) Browser_Charset -> Unicode 的效果是一样的。

如果在Request里面设置了CharacterEncoding,那么POST Data参数就不

需要自己手工转换了,web server的自动转换就是正确的。URL的参数编码还涉及到URL编码,需要考虑的问题多一些,没有这么简单。

JVM把数据发到浏览器的时候。也需要考虑编码问题。可以在Response里面设置。另外,HTML Meta Header里面也可以设置编码,提醒Browser选择正确编码。

有些语言的VM或者解释器的字符串编码可能不同。比如,Ruby。不过,编码转换原理都是一样的。

That is all.

JAVA字符编码

一、概要

在JAVA应用程序特别是基于WEB的程序中,经常遇到字符的编码问题。为了防止出现乱码,首先需要了解JAVA是如何处理字符的,这样就可以有目的地在输入/输出环节中增加必要的转码。其次,由于各种服务器有不同的处理方式,还需要多做试验,确保使用中不出现乱码。

二、基本概念

2.1 JAVA中字符的表达

JAVA 中有char、byte、String这几个概念。char 指的是一个UNICODE字符,为16位的整数。byte 是字节,字符串在网络传输或存储前需要转换为byte数组。在从网络接收或从存储设备读取后需要将byte数组转换成String。String是字符串,可以看成是由char组成的数组。String 和 char 为内存形式,byte是网络传输或存储的序列化形式。

举例:

String ying = “英”;

char ying = ying.charAt(0);

String yingHex = Integer.toHexString(ying);

82 F1

byte yingGBBytes = ying.getBytes(“GBK”);

GB编码的字节数值

D3 A2

2.2 编码方式的简介

String序列化成byte数组或反序列化时需要选择正确的编码方式。如果编码方式不正确,就会得到一些0x3F的值。常用的字符编码方式有ISO8859_1、GB2312、GBK、UTF-8/UTF-16/UTF-32。

ISO8859_1用来编码拉丁文,它由单字节(0-255)组成。

GB2312、GBK用来编码简体中文,它有单字节和双字节混合组成。最高位为1的字节和下一个字节构成一个汉字,最高位为0的字节是ASCII码。

UTF-8/UTF-16/UTF-32是国际标准UNICODE的编码方式。用得最多的是UTF-8,

主要是因为它在对拉丁文编码时节约空间。

UNICODE值 UTF-8编码

U-00000000 - U-0000007F: 0xxxxxxx

U-00000080 - U-000007FF: 110xxxxx 10xxxxxx

U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx

U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxx xxx

U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxx xxx 10xxxxxx

U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxx xxx 10xxxxxx 10xxxxxx

三、J2SE中相关的函数

String str =”英”;

//取得GB2312编码的字节

byte[] bytesGB2312 = str.getBytes(“GB2312”);

//取得平台缺省编码的字节(solaris为ISO8859_1,windows为GB2312) byte[] bytesDefault = str.getBytes();

//用指定的编码将字节转换成字符串

String newStrGB = new String(bytesGB2312, “GB2312”);

//用平台缺省的编码将字节转换成字符串(solaris为ISO8859_1,windows为GB2312)

String newStrDefault = new String(bytesDefault);

//用指定的编码从字节流里面读取字符

InputStream in = xxx;

InputStreamReader reader = InputStreamReader( in, “GB2312”);

char aChar = reader.read();

四、JSP、数据库的编码

4.1 JSP中的编码

(1) 静态声明:

CHARSET有两个作用:

JSP文件的编码方式:在读取JSP文件、生成JAVA类时,源JSP文件中汉字的编码

JSP输出流的编码方式:在执行JSP时,往response流里面写入数据的编码方式

(2) 动态改变:在往response流里面写数据前可以调用

response.setContentType(),设定正确的编码类型。

(3) 在TOMCAT中,由Request.getParameter() 得到的参数,编码方式都是ISO8859_1。所以如果在浏览器输入框内输入一个汉字“英”,在服务器端就得到一个ISO8859_1编码的(0x00,0xD3,0x00,0xA2)。所以通常在接收参数时转码:

String wrongStr = response.getParameter(“name”);

String correctStr = new String(wrongStr.getBytes(“ISO8859_1

”),”GB2312”);

在最新的SERVLET规范里面,也可以在获取参数之前执行如下代码:

request.setCharacterEncoding(“GB2312”);

4.2 数据库的编码

(1) 数据库使用UTF-16

如果String中是UNICODE字符,写入读出时不需要转码

(2) 数据库使用ISO8859_1

如果String中是UNICODE字符,写入读出时需要转码

写入:

String newStr = new String(oldStr.getByte(“GB2312”),“IS

O8859_1”);

读出:

String newStr = new String(oldStr.getByte(“ISO8859_1”),”G B 2312”);

五、源文件的编码

5.1 资源文件

资源文件的编码方式和编辑平台相关。在WINDOWS平台下编写的资源文件,以GB2312方式编码。在编译时需要转码,以确保在各个平台上的正确性:

native2ascii ?encoding GB2312 source.properties

这样从资源文件中读出的就是正确的UNICODE字符串。

5.2 源文件

源文件的编码方式和编辑平台相关。在WINDOWS平台下开发的源文件,以GB2312方式编码。在编译的时候,需要指定源文件的编码方式:

javac ?encoding GB2312

JAVA编译后生成的字节文件的编码为UTF-8。

①最新版TOMCAT4.1.18支持request.setCharacterEncoding(String enc)

②资源文件转码成https://www.wendangku.net/doc/6312328895.html,=u82f1u65afu514b

③如果数据库使用utf-16则不需要这部分转码

④页面上应有

转码?:

String s = new String

(request.getParameter(“name”).getBytes(“ISO8859_1”),”GB2312”);

转码?:

String s = new String(name.getBytes(“GB2312”),”ISO8859_1”);

转码?:

String s = new String(name.getBytes(“ISO8859_1”),” GB231 2”);

=========================================================

JAVA内部究竟是用的什么字符编码呢?这个问题我也找了很久,后来在THINK IN JAVA 3rd的12章里看到一个例子出现了UTF-16BE,难道是它?

byte[] utf_16be = name.getBytes("utf-16be");

printbyte(utf_16be);

结果出来了:58 02 length = 2

哈哈,I got it!不多不少两个字节,内容也一样。果然是它。同时我在里面也看到,UNICODE的编码还有一个LE,这里的BE,LE我想应该是bigendian 和littleendian吧。

==========================================================

import java.io.*;

public class TestCodeIO {

public static void main(String[] args ) throws Exception{

InputStreamReader isr = new InputStreamReader(System.in,"iso8859-1");

//Create an Input StreamReader that uses the given charset decoder

BufferedReader br = new B ufferedReader (isr);

String strLine = br.readLin e();

br.close();

isr.close();

System.out.println(strLine); System.out.println(new String (strLine.getBytes(),"iso8859-1"));//错误改法

//Encodes this St ring (strLine) into a sequence of bytes using the p latform's

//default charset(g b2312) then constructs a new String by decoding the

//specified array o f bytes using the specified charset (iso8859-1)

//because this Stri ng (strLine) uses the charset decoder "iso8859-1",so it can

//only be encoded

by "iso8859-1",cann't be encoded by the platform's defa ult

//charset "gb2312",so this line is wrong.

System.out.println(new String ( strLine.getBytes("iso8859-1")));//正确改法

//Encodes this String (strLine) into a sequence of bytes using the named

//charset (iso8859-1),t hen constructs a new String by decoding the

//specified array of bytes using the platform's default charset (gb2312). //This line is righ t.

}

}

上面的英文注释已经说得很清楚了,这里我还是解释一下吧:

首先是错误的改

法 System.out.println(new String (strLine.getBytes(),"iso8859 -1"));

这句代码是将strLine中的字符串用系统默认的编码方式(这里是gb2312)

转换为字节序列,然后用指定的编码方式(这里是iso8859-1)构造一个新的String对象,并打印到屏幕上。

错误在哪里呢?

请注意这一段代码

InputStreamReader isr = new InputStreamReader(System.in,"iso8 859-1");

BufferedReader br = new BufferedReader (isr);

String strLine = br.readLine();

这里strLine存储的内容是用指定的编码方式(iso8859-1)存储的,而转换成字节码

的时候(这句代码strLine.getBytes())却使用了系统默认的gb2312编码,所以当然就

输出乱码了!然后用gb2312编码的字节序列构建新的String对象的时候又使用了

iso8859-1编码,所以输出的乱码和System.out.println(strLine)有所不同。

至于正确的改法就不用详细说明了吧,首先将strLine用iso8859-1编码方式转换成字节

序列,然后用系统默认的编码方式(gb2312)构建新的String对象,然后打印输出。

公司内部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位定长

Java 输入输出(含部分答案)

Java输入输出 知识点: 1、文件和流的操作,理解字节流和字符流的概念 2、异常处理的概念,自定义异常类 一、选择题 1、如果一个程序段中有多个catch,则程序会按如下哪种情况执行( ) A)找到合适的例外类型后继续执行后面的catch B)找到每个符合条件的catch都执行一次 C)找到合适的例外类型后就不再执行后面的catch D)对每个catch都执行一次 2、程序员将可能发生异常的代码放在()块中,后面紧跟着一个或多个()块。 A) catch、try B) try、catch C) try、exception D) exception、try 3、在Java语言中,在程序运行时会自动检查数组的下标是否越界,如果越界,会抛掷下面的异常( ) A) SQLException B) IOException C) ArrayIndexOutOfBoundsExcetion D) SecurityManager 4、在Java中,关于捕获异常的语法try-catch-finally的下列描述哪些正确( ) A) try-catch必须配对使用B) try可以单独使用 C) try-finally必须配对使用D) 在try-catch后如果定义了finally,则finally肯定会执行 5、给定下面的代码片断: public class Animal{ public void Cat(){ try{ Method(); } catch(ArrayIndexOutBoundsException e) {"Exception1");} catch(Exception e) {"Exception2");} finally {"Hello World!!");} } public void Method() { } public static void main(String[] args) { =new Animal (); Ani. Cat (); } } 如果函数method正常运行并返回,会显示下面的哪些信息( ) A) Hello World B) Exception1 C) Exception2 D) Hello World!!

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方法用于高校读取一行字符串

对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.wendangku.net/doc/6312328895.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.wendangku.net/doc/6312328895.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.wendangku.net/doc/6312328895.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

黑马程序员Java教程:PrintWriter-字符打印流

PrintWriter:字符打印流 构造函数参数: 1. 字符串路径 2. File对象 3. 字节输出流 4. 字符输出流 示例2: 1.import java.io.BufferedReader; 2.import java.io.InputStreamReader; 3.import java.io.PrintWriter; 4.import java.io.IOException; 5. 6.public class PrintWriterDemo{ 7. public static void main(String[] args) throws IOException { 8. BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); 9. PrintWriter out = new PrintWriter(System.out); 10. 11. String line = null; 12. while((line = bufr.readLine()) != null){ 13. if("over" .equals(line)) 14. break; 15. out.println(line.toUpperCase()); 16. out.flush(); 17. } 18. 19. out.close(); 20. bufr.close();

21. } 22.} 23. 运行结果: 示例3: 1.import java.io.BufferedReader; 2.import java.io.FileWriter; 3.import java.io.InputStreamReader; 4.import java.io.PrintWriter; 5.import java.io.IOException; 6. 7.//写入到out.txt文件中 8.public class PrintWriterDemo{ 9. public static void main(String[] args) throws IOException { 10. BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); 11. //PrintWriter构造函数的第二个参数设置为true,表示自动刷新 12. PrintWriter out = new PrintWriter(new FileWriter("out.txt" ),true); 13. 14. String line = null; 15. while((line = bufr.readLine()) != null){ 16. if("over" .equals(line))

相关文档