转载请申明出处:http://blog.csdn.net/xmxkf

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("utf.txt"),"gbk");

char[] buf =new
char
[10];

int len =isr.read(buf);

Strings = new String(buf,0,len);

System.out.println(s);   //浣犲ソ,

//为什么?因为utf是一个文字3个字节,gbk一个文字两个字节,

//用gbk编码表读文件上两个文字(6个字节),会读出3个字,乱码

//如果用gbk写数据,utf解析数据,返回??

}

public
static void
writeText()
throws
IOException

{

//转换流融合了编码表,按照特定编码表写文件

OutputStreamWriterosw =

newOutputStreamWriter(new FileOutputStream("utf.txt"),"utf-8");

osw.write("你好");

osw.close();

}

}

day21-07-字符编码(编码,解码)

import java.util.Arrays;

/**

*编码:字符串变成字节数组 String->byte[];str.getbytes(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.println(Arrays.toString(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.println(Integer.toBinaryString(b&255));

//11000001   10101010       11001101       10101000

}

}

}

day21-09-练习

需求:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括姓名,三门课成绩);并把学生信息和计算出的总分数高低顺序存放在磁盘文件“student.txt”中

1、描述学生对象    2、定义一个可操作学生对象的工具类

分析:1、通过获取键盘录入一行数据,并将该行中的信息取出封装成学生对象;

2、因为学生有很多,那么就需要存储,使用到集合。因为要对学生总分排序;所以可使用TreeSet;

3、将集合的信息写入到一个文件中。

//获取键盘录入学生信息,并存放到TreeSet集合中

public
static
Set<Student>getStudent(Comparator<Student> cmp) throws IOException

{

BufferedReaderbufr=

new BufferedReader(newInputStreamReader(System.in));

Stringline = null;   //用于接收读取的一行数据

Set<Student>stus = null; //存放学生对象

if(cmp==null)  //不传入比较器,学生排序依据自己实现的compareTo方法

stus= new TreeSet<Student>();

else     //传入比较器

stus= new TreeSet<Student>(cmp);  //带比较器的集合

while((line=bufr.readLine())!=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
)  告知此字符串是否匹配给定的正则表达式。

1、匹配:String  matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配不成功,返回false。

public
static void
matcesDemo()

{

Stringstr = "b23a";

// 字符类(字母即可,不分大小写) 预定义字符类\d戴白数字0-9,

//Greedy 数量词X* X,零次或多次

Stringregex = "[a-zA-Z]\\d*";

boolean b =str.matches(regex);

System.out.println(b);

}

//匹配手机号端  13xxx   15xxx 18xxx

public
static void
checkTel()

{

Stringtel = "13825883688";

StringtelReg = "1[358]\\d{9}";

System.out.println(tel.matches(telReg));

}

03-正则表达式(切割)

String[]split(String regex)  根据给定正则表达式的匹配拆分此字符串。

public
static void
splitDemo(Stringstr, String reg)

{

String[]arr = str.split(reg);

System.out.println(arr.length);

for(String s : arr)

{

System.out.println(s);

}

}

主方法调用:

splitDemo("zhangsan    lisi wangwu"," +");//按一个或多个空格切

splitDemo("zhangsan.lisi.wangwu","\\.");     
//按'.'切

splitDemo("c:\\abc\\a.txt","\\\\");                
//按\\切

splitDemo("erkkasdqqsfdzzo"," +(.)\\1+");//按照叠词完成切割 重复的词  +代表出现多次

组:按照叠词完成切割,为了可以让规则的结果重用,可以将规则封装成一个组。用()完成。组的出现都有编号,从1开始。要想使用已有的组可以通过\n(n就是租的编号)的形式来获取。    ((())())判断几个组数左括号(,判断组的编号也看(。

04-正则表达式(替换)

String
replaceAll(String regex,String replacement)

使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

public
static void
replaceAllDemo(String str, String reg, String newStr)

{

str= str.replaceAll(reg, newStr);

System.out.println(str);

}

主方法调用:

String str1 = "wer15645648t123d3465u";

replaceAllDemo(str1,"\\d{5,}","#");   
//将字符串中的5个以上数组替换成#

Stringstr2 = "erkkefqqqdvfxxxxm";

replaceAllDemo(str2,"(.)\\1+","&");   
//将叠词替换成&

Stringstr3 = "erkkefqqqdvfxxxxm";

replaceAllDemo(str3,"(.)\\1+","$1");   
//将重叠字母替换为单个字母,$取第一组

day25-05-正则表达式(获取)

java.util.regex

类 Pattern

正则表达式第四个功能:

获取:将字符串中的符合规则的子串取出。

操作步骤:

1、  将正则表达式封装成对象;

2、  让正则对象和要操作的字符串相关联;

3、  关联后,获取正则匹配引擎;

4、  通过引擎对符合规则的子串进行操作,比如取出。

public
static void
getDemo()

{

Stringstr = "ming tian jiu yao fang jia le ,da jia。";

System.out.println(str);

Stringreg = "\\b[a-z]{4}\\b";     //单词边界,连续四个字母

Patternp = Pattern.compile(reg);  
//讲规则封装成对象

//将正则对象和要作用的字符串相关联,获取匹配器对象

Matcherm = p.matcher(str);

//boolean b =m.find(); 尝试查找与该模式匹配的输入序列的下一个子序列

//System.out.println(b);

//System.out.println(m.group());返回由以前匹配操作所匹配的输入子序列

//其实其实,String类中的matches ,replaceAll等方法用的就是Pattern和Matcher对象来完成的

System.out.println("matches:"+m.matches());   //matches是整个匹配 
false

while(m.find())   //find()是单个查找,直到找到符合规则子串

{

System.out.println(m.group());   //
返回由以前匹配操作所匹配的输入子序列

System.out.println(m.start()+"…"+m.end());

}

}

其实,String类中的matches ,replaceAll等方法用的就是Pattern和Matcher对象来完成的。

只不过被String封装后,用起来较为简单,但是功能却单一。

day25-06-正则表达式(练习1)

需求:将下列字符串转成:我要学编程

到底用四种功能中的哪一个呢?或者那几个?

思路:

1、 如果只想知道字符串师傅符合规则,使用匹配;

2、 想要将已有的字符串变成另一个字符串,替换;

3、 想要按照自定义的方式将字符串变成多个字符串,切割;获取规则以外的子串;

4、 想要拿到符合需求的字符串子串,获取;获取符合规则的子串。

public
static void
test_1()

{

Stringstr = "我我..我我...我要....要要..要...学学学.....学编........编编..编程......程";

/*将已有字符串编程另一个字符串,使用替换功能

* 1、先将.去掉

* 2、再将多个重复的内容变成单个内容

*/

str= str.replaceAll("\\.+","");  
//将多个点替换为空

System.out.println(str);//我我我我我要要要要学学学学编编编编程程

str= str.replaceAll("(.)\\1+","$1");

System.out.println(str);  //我要学编程

}

day25-06-正则表达式(练习2)

一、将IP地址进行地址段顺序排序。

192.68.1.254  102.45.23.14  10.10.10.10 2.2.2.2  2.3.2.2  6.32.105.30

还按照字符串自然顺序,只要让它们每一段都是3位即可。

1、 按照每一段需要的最多的0进行补齐,那么每一段就会至少保证3位。

2、 将每一段只保留3位,这样,所有的IP地址都是每一段3位。

public
static void
test_2()

{

String IP = "192.68.1.254  102.45.23.14 10.10.10.10 2.2.2.2  2.3.2.2  6.32.105.30";

IP = IP.replaceAll("(\\d+)","00$1");

System.out.println(IP);

IP = IP.replaceAll("0*(\\d{3})","$1");

System.out.println(IP);

String[] arr = IP.split(" +");

TreeSet<String> ts = newTreeSet<String>();

for(String s : arr)

{

ts.add(s);        //排序

}

for(String s : ts)

{

System.out.println(s.replaceAll("0*(\\d+)","$1"));     //去掉前面的0

}

}

二、需求:对邮件地址进行校验

public
static void
checkMail()

{

String mail = "abc12@sina.com";

String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";//+一次或多次  
较为精确的匹配

reg = "\\w+@\\w+(\\.\\w+)+";    //相对不太精确的匹配

//mail.indexOf(@)!=-1;

System.out.println(mail.matches(reg));

}

day25-08-正则表达式(网页爬虫)

获取指定文档中的邮件地址,使用功能Pattern Mather

public
static void
getMails()
throws
Exception

{

BufferedReaderbufr = new BufferedReader(new FileReader("mail.txt"));

Stringline = null;

Stringmailreg = "\\w+@\\w+(\\.\\w+)+";

Patternp = Pattern.compile(mailreg);

while((line=bufr.readLine())!=null)

{

Matcherm = p.matcher(line);

while(m.find())

{

System.out.println(m.group());

}

}

}

网页上获取

public
static void
getMails_2()
throws
Exception

{

URLurl = new URL("http://127.0.0.1:8080/myweb/mail.html");

URLConnectionconn = url.openConnection(); 
//获取链接对象

BufferedReaderbufIn =

new BufferedReader(new InputStreamReader(conn.getInputStream()));

Stringline = null;

Stringmailreg = "\\w+@\\w+(\\.\\w+)+";

Patternp = Pattern.compile(mailreg);

while((line=bufIn.readLine())!=null)

{

Matcherm = p.matcher(line);

while(m.find())

{

System.out.println(m.group());

}

}

}

java--字符编码,正则表达式的更多相关文章

  1. 【字符编码】Java字符编码详细解答及问题探讨

    一.前言 继上一篇写完字节编码内容后,现在分析在Java中各字符编码的问题,并且由这个问题,也引出了一个更有意思的问题,笔者也还没有找到这个问题的答案.也希望各位园友指点指点. 二.Java字符编码 ...

  2. Java 字符编码归纳总结

    String newStr = new String(oldStr.getBytes(), "UTF-8");       java中的String类是按照unicode进行编码的 ...

  3. 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  4. 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换

    http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...

  5. 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  6. Java 字符编码(二)Java 中的编解码

    Java 字符编码(二)Java 中的编解码 java.nio.charset 包中提供了一套处理字符编码的工具类,主要有 Charset.CharsetDecoder.CharsetEncoder. ...

  7. Java 字符编码(三)Reader 中的编解码

    Java 字符编码(三)Reader 中的编解码 我们知道 BufferedReader 可以将字节流转化为字符流,那它是如何编解码的呢? try (BufferedReader reader = n ...

  8. Java 字符编码(一)Unicode 字符编码

    Java 字符编码(一)Unicode 字符编码 Unicode(http://www.unicode.org/versions/#TUS_Latest_Version) 是一个编码方案,说白了希望给 ...

  9. java字符编码详解

    引用自:http://blog.csdn.net/jerry_bj/article/details/5714745 GBK.GB2312.iso-8859-1之间的区别 GB2312,由中华人民共和国 ...

  10. JAVA字符编码三:Java应用中的编码问题

    第三篇:JAVA字符编码系列三:Java应用中的编码问题 这部分采用重用机制,引用一篇文章来完整本部分目标. 来源:  Eceel东西在线 问题研究--字符集编码  地址:http://china.e ...

随机推荐

  1. springMVC+Hibernate4+spring整合实例二(实例代码部分)

    UserController.java 代码: package com.edw.controller; import java.io.IOException; import java.io.Print ...

  2. 19 主线程向子线程发送信息(handler)

    package com.fmy.handler; import android.app.Activity; import android.os.Bundle; import android.os.Ha ...

  3. Anakia 转换xml文档为其他格式

    一.简介 Anakia 使用JDOM 和Velocity将XML文档转换为特定格式的文档 二.解析xml文档方法 1.DOM java jdk,xml-api.jar 需要加载整个xml文档来构建层次 ...

  4. ubuntu16.04主题美化和软件推荐

    前几天把ubuntu从15.10更新到了16.10,在网上看到有很多直接更新出问题的,正好赶上换SSD,于是采用全新安装,之前用ubuntu的时候装软件最让人头疼了,这回又得头疼一次了!! 索性把他记 ...

  5. jsp中文乱码 Servlet中文乱码 utf-8

    JSP+Servlet项目中,项目统一使用utf-8编码.配置过滤器过滤所以请求并设置utf-8编码,jsp页面也都设置utf-8,但是还有一点很容易忽视的就是tomcat也要设置utf-8,默认情况 ...

  6. 安卓banner图片轮播

    之前写过一篇关于首页图片广告轮播的demo:http://blog.csdn.net/baiyuliang2013/article/details/45740091,不过图片轮播的指示器(小白点)处操 ...

  7. (八十七)AutoLayout的简介与实例

    AutoLayout是继AutoResizing之后的一种自动布局方法,解决了AutoResizing无法处理控件间相互关系的问题. AutoLayout在storyboard中通过底部工具条设置,底 ...

  8. Qt中实现启动画面

    纵所周之,当一个程序的启动比较耗时的时候,为了不让用户枯燥的等待或者是误以为程序运行异常了,所以我们都会在启动比较耗时的程序中加上启动界面 ,例如office软件等等. 在Qt中实现启动界面,主要就是 ...

  9. 利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl

    利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl 首先mingw的环境搭建,务必遵循下文: http://blog.csdn.net/ubuntu64fan/ar ...

  10. TCP/IP入门(2) --网络层

    /** 本篇博客由 126(127不可用) 2^24 -2 B 2^14 -1 128.1 191.255 2^16 -2 C 2^21 -1 192.0.1 223.255.255 2^8 -2 D ...