java--字符编码,正则表达式
day21  字符编码
06-IO流(转换流的字符编码)
字符编码:
1、 字符流的出现为了⽅便操作字符,更重要的是加⼊了编码转换。
2、 通过⼦类转换流来完成:InputStream  OutputStream
3、 在两个对象进⾏构造是可以加⼊字符集。
4、 可以加⼊编码表的流还有PrintStream和PrintWriter,但是这两个流只能打印,不能读取
编码表由来:
计算机只能识别⼆进制数据,早起由来是电信号;为了⽅便应⽤计算机,让它可以识别各个国家的⽂字,就将各国的⽂字⽤数字来表⽰,并⼀⼀对应形成⼀张表。这就是编码表
常见的编码表:
ASCII:  美国标准信息交换码。⽤⼀个字节的7位可以表⽰;
ISO8859-1: 拉丁码表。欧洲码表。⽤⼀个字节的8位表⽰;
GB2312:  中国的中⽂编码表;两个字节存储⼀个⽂字
GBK:    中国的中⽂编码表升级,融合了更多的中⽂⽂字符号;
Unicode: 国际标准码,融合了多种⽂字;所有的⽂字都⽤两个字节来表⽰,java语⾔使⽤的就是unicode
UTF-8:  (unicode升级)最多⽤三个字节来表⽰⼀个字符
…………
了解:
1、我们常⽤的码表:gbk  ,  utf-8 ,  iso8859-1
访问服务器时,张三----à编码(gbk)------àTomcat服务器解码(iso8859-1)---à编码(iso8859-1)----à解码(gbk)张三
2、但是gbk和utf-8不能编码解码,因为都识别中⽂,⽤gbk编码的字节数组⽤utf解码,再⽤utf编码得到的字节数组不会是以前那个字节数组,所以再⽤gbk解码得到的字符串不同
import java.io.*;
/**
* ⽤gbk编码表和utf编码表分别写⽂件和读取⽂件。
* 但是⽤⼀个表写⽂件,⽤另外⼀个表读取⽂件,就会乱码
*/
public class EncodeStream
{
public static void main(String[]args)throws IOException
writeText();
readText();
}
public static void readText() throws IOException
{
//⽤gbk编码表读取⽂件,但是⽂件使⽤utf表写的
InputStreamReaderisr =
new InputStreamReader(new FileInputStream(""),"gbk");
char[] buf =new char[10];
int len =ad(buf);
Strings = new String(buf,0,len);
System.out.println(s);  //浣犲ソ,
java语言使用的字符码集是//为什么?因为utf是⼀个⽂字3个字节,gbk⼀个⽂字两个字节,
/
/⽤gbk编码表读⽂件上两个⽂字(6个字节),会读出3个字,乱码
//如果⽤gbk写数据,utf解析数据,返回??
}
public static void writeText() throws IOException
{
//转换流融合了编码表,按照特定编码表写⽂件
OutputStreamWriterosw =
new OutputStreamWriter(new FileOutputStream(""),"utf-8");              osw.write("你好");
osw.close();
}
}
day21-07-字符编码(编码,解码)
import java.util.Arrays;
/**
*编码:字符串变成字节数组 String->byte[];bytes(charsetName);
*解码:字节数组变成字符串byte[]->String; newString(byte[],charsetNmae);
public class EncodeDemo
{
public static void main(String[] args) throws Exception
{
Strings = "你好";
//    byte[] b1 = s.getBytes();  //默认是gbk编码表
byte[] b1 = s.getBytes("GBK");  //[-60, -29, -70, -61]
Strings1 = new String(b1,"GBK");    //s1=你好
Strings2 = new String(b1,"ISO8859-1");  //s2=
//对s进⾏iso8859-1编码 [-60, -29, -70, -61]
byte[] b2 =s2.getBytes("ISO8859-1");
Strings3 = new String(b2,"GBK");
System.out.String(b2));
}
}
day21-08-字符编码-联通
1、记事本是⼀个软件,新建⼀个记事本⽂件后往⾥⾯写⼊数据,然后保存,记事本会以gbk编码表对
字符串进⾏编码;关闭记事本后再次打开,记事本会对其中存的字节码进⾏解码并显⽰出来,但是不⼀定是按照gbk来解码。
2、但是汉字中有两个特殊的字“联通”,它通过记事本编码后得到四个字节码,分别为11000001  10101010 11001101 10101000  符合utf-8(null字符’\u0000’以及从’\u0080’到’\u07FF’的范围内的字符⽤两个字节表⽰)。
所以记事本⾸先就去⽤utf-8编码表去解码并显⽰出来,造成乱码
注意:前⾯加上字母abc……也⼀样,因为utf-8也可以⽤⼀个字节表⽰字母
在API中DataInputStream类下⾯可以查看到utf-8内容
public class LianTong
{
public static void main(String[]args) throws Exception
{
Strings = "联通";
byte[] by = s.getBytes("gbk");
for(byte b : by)
{
//取最后8位&255,得到的就是其中⼀个字节码
System.out.BinaryString(b&255));
//11000001  10101010      11001101      10101000
}
}
}
day21-09-练习
需求:有五个学⽣,每个学⽣有3门课的成绩,从键盘输⼊以上数据(包括姓名,三门课成绩);并把学⽣信息和计算出的总分数⾼低顺序存放在磁盘⽂件“”中
1、描述学⽣对象
2、定义⼀个可操作学⽣对象的⼯具类
分析:1、通过获取键盘录⼊⼀⾏数据,并将该⾏中的信息取出封装成学⽣对象;
2、因为学⽣有很多,那么就需要存储,使⽤到集合。因为要对学⽣总分排序;所以可使⽤TreeSet;
3、将集合的信息写⼊到⼀个⽂件中。
//获取键盘录⼊学⽣信息,并存放到TreeSet集合中
public static Set<Student>getStudent(Comparator<Student> cmp) throws IOException
{
BufferedReaderbufr=
new BufferedReader(new InputStreamReader(System.in));
Stringline = null;  //⽤于接收读取的⼀⾏数据
Set<Student>stus = null; //存放学⽣对象
if(cmp==null)  //不传⼊⽐较器,学⽣排序依据⾃⼰实现的compareTo⽅法
stus= new TreeSet<Student>();
else//传⼊⽐较器
stus= new TreeSet<Student>(cmp);  //带⽐较器的集合
while((adLine())!=null)
{
if("over".equals(line))
break;
String[]info = line.split(",");
/
/String name =info[0];
System.out.println(info.length);
Studentstu = new Student(info[0],Integer.parseInt(info[1]),                                                                      Integer.parseInt(info[2]),
Integer.parseInt(info[3]));                    stus.add(stu);
}
bufr.close();
return stus;
}
Day25 正则表达式
01-正则表达式(特点)
正则表达式:符合⼀定规则的表达式;
作⽤:⽤于专门操作字符串;
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则表达式越长,阅读性越差。
特点:⽤于⼀些特定的符号来表⽰⼀些代码操作,这样就简化书写。
所以学习正则表达式就是在学习⼀些特殊字符的使⽤。
//对qq好进⾏校验,5~15位,不以0开头,只能是数字
public static void checkQQ()
{
Stringqq = "156655";
//第⼀位1-9,0-9出现4⾄14次, 或者[1-9]\\d{4,14}
Stringregex = "[1-9][0-9]{4,14}";
boolean flag =qq.matches(regex);
if(flag)
System.out.println(qq+"…is ok");
else
System.out.println(qq+"…不合法");
}
02-正则表达式(匹配)返回
boolean matches(String regex)  告知此字符串是否匹配给定的正则表达式。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。