【Java学习笔记】编码学习

简介: 作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.ASCII码 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

1.ASCII码
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。
ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。
2.Unicode
如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。
Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。
3.UTF-8

互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

4.应用:

Java中,如果我们用java.io.FileReader或者java.io.FileWriter来读写文件的话,我们会发现在FileReader和 FileWriter中我们只能获取编码方式,而不能设置。这样,在FileReader和FileWriter中的编码设置只能服从于一些更为底层的设置,那么在读写多种语言编码的文件时就很容易出现乱码。解决的方法是采用java.io.FileInputStream/java.io.InputStreamReader和java.io.FileOutputStream/java.io.OutputStreamWriter。在 InputStreamReader和OutputStreamWriter中,可以通过指定编码方式来完成UTF-8文件的读写。当然我们可以通过 java.io.BufferedReader和java.io.BufferedWriter来提高效率。
比如:
java.io.BufferedWriter writer = null;
java.io.FileOutputStream writerStream = new java.io.FileOutputStream(filename);   
writer = new java.io.BufferedWriter(new java.io.OutputStreamWriter(writerStream, "UTF-8")); 
// do something
// writing file
writer.close();

也可以使用下列的方法,

例如: 用 java 将文件的编码从GBK 转换成 UTF8

private static void transferFile(String srcFileName, String destFileName) throws IOException {
   String line_separator = System.getProperty("line.separator");
   FileInputStream fis = new FileInputStream(srcFileName);
   StringBuffer content = new StringBuffer();
   DataInputStream in = new DataInputStream(fis);
   BufferedReader d = new BufferedReader(new InputStreamReader(in, "GBK"));
   String line = null;
   while ((line = d.readLine()) != null)
    content.append(line + line_separator);
   d.close();
   in.close();
   fis.close();
   Writer ow = new OutputStreamWriter(new FileOutputStream(destFileName), "utf-8");
   ow.write(content.toString());
   ow.close();
}

 

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/


               作者:gnuhpc
               出处:http://www.cnblogs.com/gnuhpc/
               除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


分享到:

目录
相关文章
|
1天前
|
存储 安全 Java
12条通用编程原则✨全面提升Java编码规范性、可读性及性能表现
12条通用编程原则✨全面提升Java编码规范性、可读性及性能表现
|
2天前
|
数据库连接
java+ssm+vue代码视频学习讲解
java+ssm+vue代码视频学习讲解
5 0
|
10天前
|
Java Spring
Java 效率编码 必备插件 Lombok 让代码更优雅
该内容是一个关于Lombok插件的教程摘要:介绍了Lombok用于减少Java开发中的模板代码,提升效率;讲解了如何在IntelliJ IDEA中安装Lombok插件,以及在pom.xml中添加依赖;并提到了@Data注解能自动生成getter/setter、equals、hashCode和toString方法,@Slf4j注解自动处理日志,@Builder用于构建对象,以及@AllArgsConstructor和@NoArgsConstructor注解生成构造函数。还鼓励探索更多Lombok的注解用法。
|
11天前
|
算法 Java 大数据
Java从入门到精通学习报告
Java从入门到精通学习报告
19 1
|
11天前
|
消息中间件 监控 安全
【JAVAEE学习】探究Java中多线程的使用和重点及考点
【JAVAEE学习】探究Java中多线程的使用和重点及考点
|
12天前
|
Java
【专栏】Java 8 的 Streams 提供了一种处理数据集合的新方式,增强了代码的可读性和可维护性
【4月更文挑战第28天】Java 8 的 Streams 提供了一种处理数据集合的新方式,增强了代码的可读性和可维护性。本文介绍了 Streams 的基本概念,如从数据源创建 Stream,以及中间和终端操作。通过过滤、映射、归并、排序、分组等案例,展示了 Streams 的使用,包括并行 Streams 提高效率。学习 Streams 可以提升代码质量和效率,文章鼓励读者在实际开发中探索更多 Streams 功能。
|
12天前
|
存储 监控 Java
Java 零基础入门学习(小白也能看懂!)四
Java 零基础入门学习(小白也能看懂!)四
|
12天前
|
存储 安全 Java
Java 零基础入门学习(小白也能看懂!)三
Java 零基础入门学习(小白也能看懂!)三
|
12天前
|
存储 机器学习/深度学习 Java
Java 零基础入门学习(小白也能看懂!)二
Java 零基础入门学习(小白也能看懂!)二
|
12天前
|
Java 编译器 程序员
Java 零基础入门学习(小白也能看懂!)一
Java 零基础入门学习(小白也能看懂!)一