2019-03-08
2019-03-08 本文已影响4人
DreamPath
io流之编码解码
字符编码
存储:
- 在计算机中储存字符都是存储的所对应的数值以二进制的形式表示
展示:
- 去相关的编码表中查找该值(存储的值)所对应的字符。
常见的:
- 1.ASCII表: 用7bit来表示存储数据,对应的字节都是正数。0-xxxxxxx
- 2.ISO-8859-1: 拉丁码表latin。一个字节8位。1-xxxxxxxx 负数
- 3.GB2312: 简体中文编码(国标码)。只涵盖六七千的简体中文和字符。一个字用两个字节表示。两个字节都是开头为1----负数
- 4.GBK:2万的中文和符号 ,两个字节表示一个字,其中一部分文字,第一个字节开头是1,第二个开头是0。gb2312做了增强(做中文网站就够了)
- 5.GB18030: 对GBK做了增强
- 6.BIG5: 支持繁体中文
- 7.Uniclde:国际标准码表,无论什么字符,都用两个字节来储存,java中的char类型就是用的这个码表来存储。char c='a' 占用两个字节。在Java中字符串和简体中文默认编码为GBK。
- 8.UTF-8:(首选编码)支持多种国家的语言,针对不同字符的范围给出不同的字节表示。0,a,A用一个字节存储,中间的字节用两个字节,中文就使用三个字节
注意: - 写入的编码和读取的编码必须要一致,否只会有乱码。
字符串--编码(getBytes())-->字节数组
字节数组--解码(new String(byte [ ]))-->字符串
import java.io.UnsupportedEncodingException;
public class transString {
public static void main(String[] args) throws UnsupportedEncodingException {
String str="你好";
String str1="琲";//bei四声
/*
你好:
utf-8编码:-28 -67 -96 -27 -91 -67 三个字节一个文字
GBK编码: -60 -29 -70 -61 两个字节一个字
琲:
utf-8编码:-25 -112 -78
GBK编码: -84 105
GBK解码原理:当第一个字节数为负数时,会接着读取下一个字节再去查询码表解码
读取过程中出现0开头的正数时会直接查询码表。
*/
byte[] bytes = str1.getBytes();
// 遍历字节数组
for (int i = 0; i <bytes.length ; i++) {
System.out.print(bytes[i]+" ");
}
System.out.println();
String s = new String(bytes, "GBK");
//默认的是utf-8编码格式,当前解码使用的是GBK,因此解析出来的文字会出现乱码
System.out.println(s);//鐞�
String s1 = new String(bytes, "utf-8");
System.out.println(s1);//琲
}
}
字符串按照字节截取
import java.io.UnsupportedEncodingException;
import java.util.Scanner;
/**
* 需求:对字符串按照字节数截取 比如 abc你好 其中有五个字符 七个字节
* 分析:
* 按照三个字节截取abc 四个截取会得到abc加上字的一半,故应该舍弃最后一个字节
* 使用GBK的截取方式要根据解码原理进行分析
*/
public class StringJieQu {
public static void main(String[] args) throws UnsupportedEncodingException {
String s = "abc你好md猛兽族";
byte[] bytes = s.getBytes("GBK");
Scanner scan = new Scanner(System.in);
while (true) {
System.out.println("请输入截取字节个数:");
int i = scan.nextInt();
if (i > bytes.length || i <= 0) {
//如果输入的是-1表示退出
if (i == -1) {
break;
}
System.out.println("输入的数字不正确,请重新输入");
continue;
}
//创建截取字符串的方法
String s1 = cutString(s, i);
System.out.println("截取" + i + "个字节得到的字符串为:" + s1);
break;
}
}
private static String cutString(String s, int len) throws UnsupportedEncodingException {
int count = 0;
//将字符串转化成字节数组
byte[] bytes = s.getBytes("GBK");
for (int i = len - 1; i >= 0; i--) {
//判断最后一位是否是负数
if (bytes[i] < 0) {
count++;
} else {
break;
}
}
//判断奇偶数
if (count % 2 == 0) {
return new String(bytes, 0, len, "GBK");
} else {
return new String(bytes, 0, len - 1, "GBK");
}
}
}