Java--编码问题

常见的编码格式:

ASCII码

总共有128个,用一个字节的低七位表示,0~31是控制字符如换行、回车、删除等,32~126是打印字符。

ISO-8859-1

扩展了ASCII码,但仍然是单字节编码,总共能表示256个字符。

GB2312

全称《信息技术  中文编码字符集》,是双字节编码。总的编码范围是A1~A7,其中A1~A9是符号区,总共包含682个符号;B0~F7是汉字区,包含6763个汉字。

GBK

全称《汉字内码扩展规范》。扩展了GB2312, 它的编码范围是8140~FEFE(去掉XX7F), 总共有23940个码位,能表示21003个汉字。它的编码是和GB2312兼容的。

UTF-16

UTF-16具体定义了Unicode字符在计算机中的存取方法。UTF-16用两个字节表示Unicode的转化格式,它采用定长的表示方法,即不论什么字符都可以用两个字符表示。Java使用UTF-16作为内存的字符存储格式。

UTF-8

UTF-16统一采用两个字节来表示一个字符,虽然简单方便,但会造成空间浪费。UTF-8采用变长技术,每个编码区域有不同的字码长度。不同类型的字符可以由1~6个字节组成。

UTF-8编码规则:

  • 如果是一个字节,最高位为0,表示这是一个ASCII字符;
  • 如果是一个字节,以11开头,则连续的1的个数暗示这个字符的字节数,例如110xxxxx代表它是双字节UTF-8字符的首字节;
  • 如果是一个字节,以10开头,表示它不是首字节。

Java中需要编码的场景:

I/O操作中存在编码

Reader和Writer是字符流,InputStream和OutputStream是字节流。而InputStreamReader和OutputStreamWriter是关联字节到字符的桥梁。

内存操作中存在编码

Java中提供了Charset类,该类中的encode()和decode()方法分别对应char[]到byte[]的编码和byte[]到char[]的编码:

Charset charset = Charset.forName("UTF-8");
ByteBuffer byteBuffer = charset.encode(string);
CharBuffer charBuffer = charset.decode(byteBuffer);

Java中还提供了ByteBuffer类,该类可以实现char到byte的软转换,它的转换不需要编码和解码,只是把一个16bit的char拆分成了2个8bit的byte。它们的实际值没有被修改,仅仅是数据类型做了转换。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小灰灰

JDK容器学习之Queue: ArrayDeque

数组双端队列 ArrayDeque 双端队列,表示可以添加元素到(或删除,获取)队列头也可以添加元素到(或删除,获取)队列尾 ? 1. 底层数据结构 类中定义成...

22160
来自专栏服务端技术杂谈

Java编码规范

命名 类名使用UpperCamelCase风格。 领域模型相关命名:DO / DTO / VO / DAO等。 方法名,参数名,成员变量,局部变量都统一使用lo...

34040
来自专栏逸鹏说道

Python3 与 C# 基础语法对比(List、Tuple、Dict专栏)

Python3 与 C# 基础语法对比(基础知识场):https://www.cnblogs.com/dotnetcrazy/p/9102030.html

9630
来自专栏逸鹏说道

Python3 与 C# 基础语法对比(List、Tuple、Dict专栏)

Python3 与 C# 基础语法对比(基础知识场):https://www.cnblogs.com/dotnetcrazy/p/9102030.html

250100
来自专栏xx_Cc的学习总结专栏

iOS底层原理总结 - 探寻block的本质(二)

31140
来自专栏DannyHoo的专栏

OC中内存管理的一些问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

15030
来自专栏一个会写诗的程序员的博客

第6章 扩展函数与属性第6章 扩展函数与属性

在使用Java的时候,我们经常使用诸如StringUtil, DateUtil等等一堆工具类,代码写起来也比较冗长。举个例子,获取一个字符串的第一个字符值、最后...

7620
来自专栏Web 开发

JavaScript的对象引用

在一个函数体内,var变量声明的变量,其作用域只在该函数体内,对于函数体外而言,是不可见的(废话)。

8800
来自专栏haifeiWu与他朋友们的专栏

System方法总结

最近在研究Android源码,突然看到有很多和System有关,什么System.arraycopy、System.nanoTime(),所以专门花时间看了一下...

10720
来自专栏desperate633

LeetCode 7. Reverse Integer分析代码

8620

扫码关注云+社区

领取腾讯云代金券