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");
- }
- }
- }
来源: http://www.jianshu.com/p/b3f2232943a4