java笔记27 编码表与编码转换
来源:互联网 发布:河南省进出口数据 编辑:程序博客网 时间:2024/05/16 12:10
1. 编码表
1.1 字符流的出现为了发方便操作字符
更重要的是加入了编码转换。
编码转换可以通过子类转换流来完成,可以加入字符集
1.2 编码表
计算机智能识别二进制数据,早起由来是电信号
为了便于计算机识别各个国家的文字,就将各国文字用数字表示,并一一对应,形成了编码表。
常见编码表
ASCII:美国标准信息交换码
用一个字节的7位表示
ISO8859-1:拉丁码表 欧洲码表
用一个字节的8位表示
GB2312:中国的中文编码表
用两个字节
GBK:中文编码表升级,融合了更多的中文文字富豪
Unicode:国际标准码,融合了多种文字
所有文字都用两个字节来表示,Java使用的就是Unicode
UTF-8:最多用三个字节来表示一个字符
(增加了标识,节省空间)
非常重要:开发时编码转换非常常见
如果用utf-8编码区读gbk的文件,可以读出来,但是会乱码(未知字符)
如果用GBK编码读取utf文件,也可以读出来,会多出一个字符
import java.io.*;
public class H_CodeTable {
public static void main(String[] args) throws IOException {
writeText();
readText();//读出来是 浣犲ソ
}
public static void readText() throws IOException
{
InputStreamReader isr=new InputStreamReader(new FileInputStream("1-utf.txt"),"gbk");
char[] buf=new char[1024];
int len=0;
while((len=isr.read(buf))!=-1)
{
System.out.println(new String(buf,0,len));
}
isr.close();
}
public static void writeText() throws IOException
{
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("1-utf.txt"),"utf-8");
osw.write("你好");
osw.close();
}
}
2. 转换错误分析
2.1 编码:字符串编程字节数组
解码:字节数组编程字符串
String-->byte[] str.getBytes(charsetName);
byte[]-->new String(byte[],charsetName);
2.2 "你好"的gbk编码和utf编码
gbk[-60, -29, -70, -61]
utf[-28, -67, -96, -27, -91, -67]
所以当“你好”用utf编译的时候,得到了6个字节编码,再用GBK解码编程了3个字符。
解决方式:
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class H_07CodeTrans {
public static void main(String[] args) throws IOException {
//编码 获得”你好“的gbk编码和utf编码
String s="你好";
byte[] b=s.getBytes();
//byte[] b=s.getBytes("ISO8859-1");
System.out.println("gbk"+Arrays.toString(b));
byte[] b1=s.getBytes("utf-8");
System.out.println("utf"+Arrays.toString(b1));
//解码
String s1=new String(b1,"utf-8");
//乱码已经产生 如何解决因为查表错误产生的乱码
//利用原编码表获取编码
//用正确的编码表解码
System.out.println(s1);//默认gbk
}
}
结果:
gbk[-60, -29, -70, -61]
utf[-28, -67, -96, -27, -91, -67]
你好
3. “联通”乱码问题
打开记事本输入“联通”,保存后再打开,显示乱码。
原因:
import java.io.IOException;
import java.io.UnsupportedEncodingException;
public class H_08Encode {
public static void main(String[] args) throws IOException {
String s="联通";
byte[] by=s.getBytes("GBK");
for(byte b:by)
{
System.out.println(Integer.toBinaryString(b&255));
}
}
}
结果:
11000001
10101010
11001101
10101000
正常应该是GBK编码,但是刚好符合了UTF-8的编码规则,因此被用UTF-8解码,产生乱码。
- java笔记27 编码表与编码转换
- GB2312区位码、编码表与编码规则
- GB2312区位码、编码表与编码规则
- Java 编码表
- java编码表GBK、GB2312与UTF-8的区别
- java中的常用编码表
- 字符编码 - GB2312简体中文编码表
- Unicode编码表:国际统一编码
- 黑马程序员_Java基础_IO流_编码表,编码与解码
- GB2312转换为Unicode编码表
- 编码表的转换和实现过程
- IO流-字符编码表转换示例
- 编码表
- 黑马程序员--转换流对象,输出方向,转换流编码效果,字符的编码和解码,String类的构造,方法getBytes,指定编码表,File类
- java程序制作ASCII编码表
- (43)Java学习笔记——IO流 / 字符流 / 编码表
- 哈夫曼编码压缩,解压,压缩比,编码表,储存到文件
- Huffam 编码、解码和生成编码表算法实现
- C#—泛型
- 换主页轮播的主题图片(2、添加)---轻开电子商务系统(企业入门级B2C网站)
- HDU1052Tian Ji -- The Horse Racing(贪心)
- PB 数据窗口打印详细控制代码
- codeforces #307 C. GukiZ hates Boxes(贪心+二分)
- java笔记27 编码表与编码转换
- Effective c++ 3/e item 15 疑問解惑
- codeforces #307 B. ZgukistringZ(枚举+计数)
- Win10预发行版5个密钥曝光!激活就靠它
- cacti安装记录 第一阶段 LAMP源码环境配置 复盘
- 通过luarocks贡献代码
- Permutation 各种变种
- leetcode-100-Same Tree
- ipad 连接 win8 总是出现 信任此电脑