惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
P
Proofpoint News Feed
The Last Watchdog
The Last Watchdog
S
Secure Thoughts
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
News | PayPal Newsroom
Application and Cybersecurity Blog
Application and Cybersecurity Blog
O
OpenAI News
S
Security @ Cisco Blogs
宝玉的分享
宝玉的分享
Hacker News: Ask HN
Hacker News: Ask HN
T
Troy Hunt's Blog
Google Online Security Blog
Google Online Security Blog
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
TaoSecurity Blog
TaoSecurity Blog
Help Net Security
Help Net Security
Latest news
Latest news
NISL@THU
NISL@THU
S
Security Affairs
博客园_首页
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 聂微东
AI
AI
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Recent Announcements
Recent Announcements
P
Privacy & Cybersecurity Law Blog
小众软件
小众软件
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
AWS News Blog
AWS News Blog
W
WeLiveSecurity
Google DeepMind News
Google DeepMind News
I
InfoQ
Schneier on Security
Schneier on Security
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
The Exploit Database - CXSecurity.com
IT之家
IT之家
T
Threatpost
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
腾讯CDC
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
N
News and Events Feed by Topic
L
LINUX DO - 最新话题
F
Full Disclosure
大猫的无限游戏
大猫的无限游戏
H
Heimdal Security Blog
S
SegmentFault 最新的问题

Yulin Lewis' Blog

cron表达式 cmd - 常用命令 Eureka问题汇总 Excel常见用法 shell脚本常用语法 Linux常用命令 别了,向晚 必胜客自助餐 Prometheus简易入门 Chrome问题汇总 SSH命令问题汇总 PGP加解密 Apollo问题汇总 GitHub问题汇总 SmartGit问题汇总 HttpClient问题汇总 Oculus Quest2食用指南 背包英雄:匕首流无尽模式详细攻略 Linux问题汇总 Postman问题汇总 别了,珈乐 桌面窗口管理器占用内存过高 ELK系列(6) - Elasticsearch常用接口 ELK系列(5) - Elasticsearch性能调优 MyBatis问题汇总 PostgreSQL - SQL调优方案 Spring Data Redis问题汇总 Java数值问题汇总 lombok问题汇总
Java - 字符编码
雨临Lewis · 2022-02-13 · via Yulin Lewis' Blog

字符集

字符集是一系列字符的集合,将每个收录的字符和数字进行映射。最早的字符集是ASCII,使用一个字节进行存储字符,8位一共可以表示256个字符,而ASCII只使用了其中的128位,即0~127位,这128位里面包括了常用的英文字符以及标点符号。

一部分不使用英文的字符可以用后面的128位来表示,即128~256位,后面的128位也被称为扩展字符集。但是它表示的字符有限,对于汉字来说,用单字节无法表示完整,因此国标码采用了双字节来表示汉字(即GBK等编码)。

由于不同国家的语言编码不同,互相之间如何通过ASCII进行交流?于是就有了万国码Unicode。Unicode是一个几乎包括了世上所有字符的字符集,每个字符都有一个对应的独一无二的Unicode码,比如聊天时使用的emoji表情字符,GitHub上也可以通过 :grin: 这种写法来输出emoji字符,这个对应的是😁。

因为Unicode使用四个字节来存储,虽然编码效率高,但是会极大浪费存储空间,因此就有了对Unicode字符集进行编码解码的存储方式,如UTF-8等字符编码。字符编码其实就是对Unicode字符集的实现方式,用以约定如何用1~4个字节来存储字符。

字符编码

UTF-8

UTF-8是可变长编码,即多字节编码,在存储不同的字符时使用的字节数量是不同的。比如存储英文字母时只使用1个字节,而存储汉字时则使用3个字节。

UTF-8分为有BOM(Byte Order Marker)和无BOM的两种编码方式,现代文本编辑器在改变文件的编码时应该都看到过这两种编码。

UTF-8的好处是节省了空间,但编码效率降低了,即时间换空间。

UTF-16

UTF-16是双字节编码,属于定长编码。由于使用两个字节为一组来表示一个字符,那么就涉及到了字节顺序的问题,即大端小端的问题。这个是Mac机和PC机对字节顺序的理解不一致导致的历史遗留问题,机器在读取字节顺序时,会从低地址读取,将两个字节中的高位字节放在低地址表示,这就是大端BE,即big-endian。反之就是小端LE,即little-endian。

因此UTF-16存在三种编码:

  • UTF-16BE,使用两个字节进行存储的大端编码。Java就是使用的这个编码来存储字符,中文和英文都是两个字节(即char这个基础数据类型),所以Java是双字节编码。
  • UTF-16LE,使用两个字节进行存储的小端编码。
  • UTF-16,没有指定后缀,即不知道其是大端还是小端,所以需要用四个字节来存储,开始的两个字节表示该字节数组是大端还是小端。即FE FF表示大端,FF FE表示小端。

使用UTF-16的好处是编码效率较高,但浪费存储空间,属于用空间换时间。

不同字符集编码的英文字母和中文汉字的字节数

英文字母:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
编码:GB2312;字节数 : 1

编码:GBK;字节数 : 1

编码:GB18030;字节数 : 1

编码:ISO-8859-1;字节数 : 1

编码:UTF-8;字节数 : 1

编码:UTF-16;字节数 : 4

编码:UTF-16BE;字节数 : 2

编码:UTF-16LE;字节数 : 2

中文汉字:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
编码:GB2312;字节数 : 2

编码:GBK;字节数 : 2

编码:GB18030;字节数 : 2

编码:ISO-8859-1;字节数 : 1

编码:UTF-8;字节数 : 3

编码:UTF-16;字节数 : 4

编码:UTF-16BE;字节数 : 2

编码:UTF-16LE;字节数 : 2

参考链接

警告

本文最后更新于 February 13, 2022,文中内容可能已过时,请谨慎使用。

赞赏支持

微信打赏 支付宝打赏